A题:
Primary Arithmetic
Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:
%lld Java class name:
Main
当你在小学学习算数的时候,老师会教你把两个数由右至左按位加起来。很多时候,加法过程中会出现进位。对于一部分孩子,理解这个“进位”在当时是很困难的事情。现在你的工作就是编写一个程序来判断两个数相加的过程中会产生多少次进位,用以确定这两个数相加的“难度”。
Input
每一行有两个无符号整数(最大不超过1000000000),当输入0 0的时候,程序结束。
Output
对于每一行的输入两个整数,你需要判断会产生有多少个进位,每一个输出占一行。
Sample Input
123 456 555 555 123 594 0 0
Sample Output
No carry operation. 3 carry operations. 1 carry operation.
Source
解题思路:
这道题是用来判断是否有进位的,对于以后写高精度有很大的帮助了。。。先练练手了。
代码:
# include<cstdio>
# include<iostream>
# include<cstring>
int a[20];
int b[20];
int main(void)
{
long int a1,b1;
int i,j,ans,sum,d;
while(scanf("%d%d",&a1,&b1)!=EOF)
{
ans=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
if(!a1&&!b1)
{
break;
}
else
{
i=0;
while(a1!=0)
{
a[i++]=a1%10;
a1/=10;
}
j=0;
while(b1!=0)
{
b[j++]=b1%10;
b1/=10;
}
d=0;
for( int k=0;k<=((i>j)?i:j);k++)
{
sum=a[k]+b[k]+d;
if(sum>=10)
{
d=sum/10;
ans++;
}
else
d=0;
}
}
if(ans>1)
printf("%d carry operations.\n",ans);
else if(!ans)
printf("No carry operation.\n");
else
printf("1 carry operation.\n");
}
return 0;
}
B题:
Eeny Meeny Moo
Time Limit: 1000ms
Memory Limit: 65535KB
64-bit integer IO format:
%lld Java class name:
Main
大家都有这种经验,当太多的人同时使用互联网的时候,网络会变得非常,非常缓慢。为了结决这一问题,北师大制定了一项应急计划,在网络使用高峰期切断一些连接以保证网络的畅通。所有的网络连接都将被标号(从1开始,依次是2号,3号……)。当应急计划启动的时候,首先切断1号连接,然后切断1号之后的第M个连接,在然后是上一个被切断之后的第M个连接,以此类推。例如,如果有17个连接,并且M=5,则依次切断的顺序为[1,6,11,16,5,12,2,9,17,10,4,15,14,3,8,13,7]。DXY同学大公无私地将自己的机器设置为1连接,而ZSL同学的机器为2号连接。原本这种切断连接的方式是很公平的,不过ZSL同学想要知道当M为多少时,他的机器会被最后一个切断连接(他果然很不厚道)。
Input
输入不止一行,每一行都只有一个无符号整数N,且 3 <= n < 150。当输入0的时候程序退出。
Output
对于每一行的输入,输出一个最小的值M,满足ZSL同学的2号连接会被最后一个切断。
Sample Input
3 4 5 6 7 8 9 10 11 12 0
Sample Output
2 5 2 4 3 11 2 3 8 16
Source
解题思路:
类似于约瑟夫环问题,找到2在最后一个被杀死的最小的M就可以了。
代码:
# include<cstdio>
# include<iostream>
using namespace std;
int main(void)
{
int s;
int n;
while ( cin>>n )
{
if ( n==0 )
break;
for ( int i=1;;i++ )
{
s=0;
for ( int j = 2;j <= n-1;j++ )
s = ( s + i ) % j;
if ( s == 0 )
{
cout<<i<<endl;
break;
}
}
}
return 0;
}