第一周总结 王振宇

7-4 L2-被25整除

本题将给出t个数,对于每个数,你可以对其进行如下操作:

每次选择一个数并将其删除(即选择数字中的某个位置并删除位于此位置的数字)。 如果只剩下一个数字,则无法执行该操作。 如果结果数包含前导零,它们将被自动删除。

小c想知道最小进行多少次如上操作后,剩下的数字是一个能被25整除的数字

输入格式:

输入一个数字t,测试样例的组数,(0<t<=10) 每组测试输入一个数n,即待操作的数字。 (25<=n<=10^18)

输出格式:

对于每个测试用例输出在单独的一行一个整数k (k≥0),得到一个能被25整除且为正数的数字所需的最小操作次数,题目保证答案存在

输入样例:

在这里给出一组输入。例如:

5
100
71345
3259
50555
2050047

输出样例:

在这里给出相应的输出。例如:

0
3
1
3
2

结尾无空行

在第一个测试用例中,已经被给定一个能被25整除的数。

在第二个测试用例中,可以去掉数字1、3和4来得到数字75。

在第三个测试用例中,删除最后一个数字就足以得到数字325。

在第四个测试用例中,可以去掉最后三个数字以得到数字50。

在第五个测试用例中,去掉数字4和7就能得到一个符合题意的数。


/*思路:
不要傻乎乎的用int,long long来输入数字;
换个思路,想想能把25整除的数有哪些,尾数的规律;
因为只能删除数字,所以数尾数必定是5,0,不是则全删了,记下删除的数con1/con3;
第二个数分第一个数为0与5讨论;
找到第一个数与第二个数的位置,删除中间的数即可,记下记下删除的数con2/con4。
总删除的数为conw(5为第一个数)conl(0为第一个数),哪个小即为哪个。*/

#include <stdio.h>
int main()
{
    int t,len;
    char a[1900];
    int i,j,k,con1,con2,conw,conl,con3,con4;
    //printf("输入一共有多少组n:\n");
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        //printf("请输入数字 :\n");
        gets(a);
         len=strlen(a);
        conl=1000;con1=1000;con2=1000,conw=1000,con3=2000,con4=3269619;//所以con均为无穷大防止输出删除最小数被取代;
        for(i=len-1;i>=0;i--)
        {
            if(a[i]=='5')
              {
                con1=len-i-1;j=i;     //con1记下找到第一个5要删除的数
                   for(k=j-1;k>=0;k--)
                     {if(a[k]=='2'||a[k]=='7')
                             {con2=j-k-1;break;}  }//con2记下找到2||7要删除的数
                break;   //绝对不能少;否则会继续寻找下一个a[i]=='5';
              }
        } conl=con1+con2;
       // a[i]=1;
        for(i=len-1;i>=0;i--)
        {
            if(a[i]=='0')
              {
                con3=len-i-1;j=i;//con3记下找到第一个0要删除的数
                   for(k=j-1;k>=0;k--)
                     { if(a[k]=='0'||a[k]=='5')
                              {con4=j-k-1;break;} }//con4记下找到0||5要删除的数
                break;//绝对不能少;否则会继续寻找下一个a[i]=='0';
              }
        }
        conw=con4+con3;
        //printf("最小删除数为 :\n");
        if(conw>conl)printf("%d\n",conl);
        else printf("%d\n",conw);
    }
}

A - A + B Problem II

Input

输入数据的第一行为一个整数T(1≤T≤20),表示测试数据总数,紧接着的T行数据,每行包含由空格隔开的两个整数a和b,每组数据占一行。注意了,a和b可能非常大,大到超过32位整数可以表示的范围,我们假定a和b的位数不超过1000。
 

Output

对于每组数据,你需要输出两行,第一行显示"Case #:"(注意输出为英文字符),第二行为一个等式"a + b = Sum",这里的Sum就是指a + b的结果(注意这个等式中的空格)。请在每两组输出数据间输出一个空行。
 

Sample Input

2
1 2
112233445566778899 998877665544332211

Sample Output

Case 1:
1 + 2 = 3

Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110

#include <stdio.h>
#include <string.h>
int c[100000],d[1000000],e[1000000];
    char a[1000000],b[1000000];
int main()
{
    int i,s,m,n,x,y,w=0,t=0;

    scanf("%d",&s);
    while(s--)
    {   w=0;t++;
        scanf("%s",a);
        scanf("%s",b);
        if(t!=1)printf("\n");
        printf("Case %d:\n",t);
        printf("%s + %s = ",a,b);
        x=strlen(a);
        y=strlen(b);
        if(y>=x) {m=y;n=x;}
        else {m=x;n=y;}
        for(i=0;i<x;i++)  //将a[]的每个字符转化为数字存在d[]中
            {d[i]=a[i]-'0';}

        for(i=0;i<y;i++)  //将b[]的每个字符转化为数字存在e[]中
            {e[i]=b[i]-'0';}

            if(x<=y)    
            {

             for(i=0;i<m;i++)
            {
                c[i]=d[n-i-1]+e[m-i-1]+w;
                w=0;
                if(i==m-1&&c[m-1]>=10) printf("1");
                if(c[i]>=10) {w=1;c[i]=c[i]-10;} //用c[]数组储存a[]与b[]相加的数
            }

             for(i=m-1;i>=0;i--)
            printf("%d",c[i]);
            printf("\n");
            }


            else
            {

            {
                for(i=0;i<m;i++)
                {
                    c[i]=d[m-i-1]+e[n-i-1]+w;
                    w=0;
                    if(i==m-1&&c[m-1]>=10) printf("1");
                    if(c[i]>=10){w=1;c[i]=c[i]-10;}
                }
            }
            for(i=m-1;i>=0;i--)
            printf("%d",c[i]);
            printf("\n");
            }
    }
}

总结:纯C语言太难受了,该C++的学习了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值