【重赏】关于cin与scanf的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【重赏】关于cin与scanf的问题相关的知识,希望对你有一定的参考价值。

题目地址http://www.vijos.cn/Problem_Show.asp?id=1024

描述 Description
卡布列克是一位数学家,他在研究数字时发现:任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。
例如:4321-1234=3087
8730-378=8352
8532-2358=6174
7641-1467=6147
如果K位数也照此办理,它们不是变成一个数,而是在几个数字之间形成循环,称作卡布列克圆舞曲。例如对于五位数54321:
54321-12345=41976
97641-14679=82962
98622-22689=75933
97533-33579=63954
96543-34569=61974
97641-14679=82962
我们把82962 75933 63954 61974称作循环节,即卡布列克圆舞曲。

输入格式 Input Format
文件包含若干行,每行为一个待求“卡布列克圆舞曲”的起始整数(小于maxlongint)

样例输入 Sample Input
4321
54321

样例输出 Sample Output
6174
82962 75933 63954 61974

由于输入数据行数不确定
我一开始用了
while(1)
cin>>str;
..........

结果本地测试通过,评测机上跑出的答案莫名其妙,全都wa。
编译通过...
├ 测试数据 01:答案错误... ├ 标准行输出 8633...
├ 错误行输出 6147

├ 测试数据 02:答案错误... ├ 标准行输出 8630...
├ 错误行输出 7197...

├ 测试数据 03:答案错误... ├ 标准行输出 8655...
├ 错误行输出 7197...

├ 测试数据 04:答案错误...程序输出比正确答案长 9541...
├ 测试数据 05:答案错误... ├ 标准行输出 7197...
├ 错误行输出

├ 测试数据 06:答案错误... ├ 标准行输出
├ 错误行输出

├ 测试数据 07:答案错误... ├ 标准行输出
├ 错误行输出

├ 测试数据 08:答案错误... ├ 标准行输出
├ 错误行输出

├ 测试数据 09:答案错误... ├ 标准行输出
├ 错误行输出

├ 测试数据 10:答案错误... ├ 标准行输出
├ 错误行输出

-------------------------
Unaccepted 有效得分:0 有效耗时:0ms
详细评测结果在:http://www.vijos.cn/Record_Show.asp?id=1527241
后来改成
while ((scanf("%s", str)) == 1)……
就ac了这是为什么?
如果用c++写输入应该怎么写?
如果你在vijos上做过题,你会知道它是用标准输入输出的
你的回答好像跟我的问题也没什么关系

参考技术A 不是文件么 ?为什么还有cin

再说c 也好 C++也好 输入也不是只有一种方式

具体情况而定
参考技术B 我知道...vijos它的上面用C++,你用scanf吧,cin的速度没有scanf快,我的程序用cin0.95s
用scanf的话就要0.93s呵呵,就快一点儿

关于scanf与cin哪个快的问题

 

一开始入c++的时候成天跑cin,cout

直到有一天用cin,cout超时

才知道scanf比cin快的多

但是后来又听说加了ios::sync_with_stdio(false);的cin跟飞一样

那么到底哪个快呢?

咱们来做个小测试

 

题目选择:https://www.luogu.org/problem/show?pid=3368#sub

     树状数组模板2(因为这题数据比较大)

 

首先是龟速的cin与cout

成功的T掉三个点

=.=

 

那么scanf呢??

 

完美的完成任务!!

 

 

身负众望的ios::sync_with_stdio(false);呢??

 

 

 

见证奇迹的时刻。。。

 

 

 

速度虽然不及scanf

但是也是可以AC的

 

另外不得不提一下超神的读入优化

快于scanf

 

 

综上所述:

如果实在懒得敲读入优化

还是乖乖的用scanf吧。。

 

 

附代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int MAXN=500001;
 6 int n,m;
 7 int a[MAXN];
 8 int tree[MAXN];
 9 int lowbit(int p)
10 {return p&(-p);}
11 
12 void interval_increase(int x,int v)
13 {
14     for(int i=x;i>0;i=i-lowbit(i))
15     {
16         tree[i]+=v;
17     }
18 }
19 
20 int point_ask(int p)
21 {
22     int ans=a[p];
23     for(int i=p;i<=n;i=i+lowbit(i))
24     {
25         ans=ans+tree[i];
26     }
27     return ans;
28 }
29 int main()
30 {
31     //ios::sync_with_stdio(false);
32     cin>>n>>m;
33     for(int i=1;i<=n;i++)
34         cin>>a[i];
35     for(int i=1;i<=m;i++)
36     {
37         int how;
38         cin>>how;
39         if(how==1)// 增加 
40         {
41             int x,y,v;
42             cin>>x>>y>>v;
43             interval_increase(y,v);
44             interval_increase(x-1,-v);
45         }
46         else
47         {
48             int p;
49             cin>>p;
50             cout<<point_ask(p)<<endl;
51         }
52     }
53     return 0;
54 }
龟速的cin
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int MAXN=500001;
 6 int n,m,p;
 7 int tree[MAXN];//
 8 int lowbit(int p)
 9 {
10     return p&(-p);
11 }
12 void point_increase(int w,int v)
13 {
14     for(int i=w;i<=n;i=i+lowbit(i))
15         tree[i]=tree[i]+v;
16     return ;
17 }
18 int interval_ask(int x)
19 {
20     int ans=0;
21     for(int i=x;i!=0;i=i-lowbit(i))
22     {
23         ans=ans+tree[i];
24     }
25     return ans;
26 }
27 int main()
28 {
29     scanf("%d%d",&n,&m);
30     for(int i=1;i<=n;i++)
31     {
32         scanf("%d",&p);
33         point_increase(i,p);
34     }
35     for(int i=1;i<=m;i++)
36     {
37         scanf("%d",&p);
38         if(p==1)//
39         {
40             int x,y;
41             scanf("%d%d",&x,&y);
42             point_increase(x,y);
43         }
44         else// 求和 
45         {
46             int x,y;
47             scanf("%d%d",&x,&y);
48             printf("%d\\n",interval_ask(y)-interval_ask(x-1));
49         }
50     }
51     return 0;
52 }
nice的scanf
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int MAXN=500001;
 6 int n,m;
 7 int a[MAXN];
 8 int tree[MAXN];
 9 int lowbit(int p)
10 {return p&(-p);}
11 
12 void interval_increase(int x,int v)
13 {
14     for(int i=x;i>0;i=i-lowbit(i))
15     {
16         tree[i]+=v;
17     }
18 }
19 
20 int point_ask(int p)
21 {
22     int ans=a[p];
23     for(int i=p;i<=n;i=i+lowbit(i))
24     {
25         ans=ans+tree[i];
26     }
27     return ans;
28 }
29 int main()
30 {
31     ios::sync_with_stdio(false);
32     cin>>n>>m;
33     for(int i=1;i<=n;i++)
34         cin>>a[i];
35     for(int i=1;i<=m;i++)
36     {
37         int how;
38         cin>>how;
39         if(how==1)// 增加 
40         {
41             int x,y,v;
42             cin>>x>>y>>v;
43             interval_increase(y,v);
44             interval_increase(x-1,-v);
45         }
46         else
47         {
48             int p;
49             cin>>p;
50             cout<<point_ask(p)<<endl;
51         }
52     }
53     return 0;
54 }
还不错的cin优化
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int MAXN=500001;
 6 int n,m;
 7 int a[MAXN];
 8 int tree[MAXN];
 9 int lowbit(int p)
10 {return p&(-p);}
11 
12 int read(int &n)
13 {
14     char ch=\' \';int q=0,w=1;
15     for(;(ch!=\'-\')&&((ch<\'0\')||(ch>\'9\'));ch=getchar());
16     if(ch==\'-\')w=-1,ch=getchar();
17     for(;ch>=\'0\' && ch<=\'9\';ch=getchar())q=q*10+ch-48;
18     n=q*w;    return n;
19 }
20 
21 void interval_increase(int x,int v)
22 {
23     for(int i=x;i>0;i=i-lowbit(i))
24     {
25         tree[i]+=v;
26     }
27 }
28 
29 int point_ask(int p)
30 {
31     int ans=a[p];
32     for(int i=p;i<=n;i=i+lowbit(i))
33     {
34         ans=ans+tree[i];
35     }
36     return ans;
37 }
38 int main()
39 {
40     ios::sync_with_stdio(false);
41     read(n);
42     read(m);
43     for(int i=1;i<=n;i++)
44         read(a[i]);
45     for(int i=1;i<=m;i++)
46     {
47         int how;
48         read(how);
49         if(how==1)// 增加 
50         {
51             int x,y,v;
52             read(x);
53             read(y);
54             read(v);
55             interval_increase(y,v);
56             interval_increase(x-1,-v);
57         }
58         else
59         {
60             int p;
61             read(p);
62             printf("%d",point_ask(p));
63             putchar(\'\\n\');
64         }
65     }
66     return 0;
67 }
飞速的读入优化

 

以上是关于【重赏】关于cin与scanf的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于scanf和cin的问题

关于scanf 与 cin gets(),getline()......输入输出字符串的区别

c++接收问题为何cin能接收,scanf接收就出错?

关于编程比赛中输入输出的问题

cin 字符串输入

关于std::ios::sync_with_stdio(false)