DAY_1

A题:

Primary Arithmetic

Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format:  %lld      Java class name:  Main
Type: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •                   
  • 当你在小学学习算数的时候,老师会教你把两个数由右至左按位加起来。很多时候,加法过程中会出现进位。对于一部分孩子,理解这个“进位”在当时是很困难的事情。现在你的工作就是编写一个程序来判断两个数相加的过程中会产生多少次进位,用以确定这两个数相加的“难度”。

    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
    Type: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •                   
  • 大家都有这种经验,当太多的人同时使用互联网的时候,网络会变得非常,非常缓慢。为了结决这一问题,北师大制定了一项应急计划,在网络使用高峰期切断一些连接以保证网络的畅通。所有的网络连接都将被标号(从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;
    }
    


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值