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++的学习了