目录
1019 数字黑洞
https://pintia.cn/problem-sets/994805260223102976/problems/994805302786899968
思路:
用数组保存每位的数字,并用bool数组标记一下。
根据bool数组 判断各个数字是不是完全的相同,
相同根据题目输出
不相同用sort排序后 计算最大值 和最小值。
用差接着重复执行上面的步骤直到差为6174。
注意事项:
每次执行一次后都要重新的清零。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(void)
{
int n;
int temp;
int sum1,sum2;
int count;
while( cin>>n )
{
bool flag=false;
while(!flag)
{
temp=n;//保存一个副本
bool hush[10]={false};
int a[4]={0};
int i=0;
while(n)
{
a[i]=n%10;
hush[a[i]]=true;
n=n/10;
i++;
}
count=0;
if(i!=4)//说明不是4位的数 是 0012 这种的数字,0也默认出现了,所以count++
count++;
for(i=0;i<10;i++)
{
if(hush[i])
{
count++;
}
}
if(count==1)//说明各个位数都是同一个数
{
printf("%d - %d = 0000\n",temp,temp);
flag=true;
}
sort(a,a+4);
sum1=a[0]*1000+a[1]*100+a[2]*10+a[3];//小
sum2=a[3]*1000+a[2]*100+a[1]*10+a[0];//大
if(!flag)
printf("%04d - %04d = %04d\n",sum2,sum1,sum2-sum1);
n=sum2-sum1;
if(n==6174)
flag=true;
}
}
return 0;
}
书上的代码:
#include<cstdio>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
void to_array(int n,int num[])//将n的每一位存储到数组中
{
for(int i=0;i<4;i++)
{
num[i]=n%10;
n=n/10;
}
}
int to_number(int num[])
{
int sum=0;
for(int i=0;i<4;i++)
{
sum=sum*10+num[i];
}
return sum;
}
int main(void)
{
int n,min,max;
scanf("%d",&n);
int num[5];
while(1)
{
to_array(n,num);
sort(num,num+4);
min=to_number(num);
sort(num,num+4,cmp);
max=to_number(num);
n=max-min;
printf("%04d - %04d = %04d\n",max,min,n);
if(n==0||n==6174)
{
break;
}
}
return 0;
}
问题 A: 守形数
http://codeup.cn/problem.php?cid=100000588&pid=0
注意的是: 76^2=5776 这样的也是守形数
思路:
(36-6) %10 等于0
(625-25)%100等于0
(5776-76)%100等于0
综上所述可以得出如下的结论 :
(n*n-n) % 10n的位数 ==0
#include<cstdio>
int main(void)
{
int n;
int max;
int sum=1;
while( scanf("%d",&n) != EOF )
{
sum=1;
max=n*n;
int temp;
temp=n;
while(temp)
{
sum*=10;
temp=temp/10;
}
if( (max-n) % sum == 0)
{
printf("Yes!\n");
}
else
{
printf("No!\n");
}
}
return 0;
}
问题 B: 反序数
http://codeup.cn/problem.php?cid=100000588&pid=1
#include<stdio.h>
int main(void)
{
for(int i=1000;i<=9999;i++)
{
int sum=i*9;
int sum2=0;
int temp=i;
int a[5]={0};
if(sum>9999)
continue;
int j=0;
while(temp)
{
a[j]=temp%10;
j++;
temp=temp/10;
}
sum2=a[0]*1000+a[1]*100+a[2]*10+a[3];
if(sum2==sum)
printf("%d\n",i);
}
return 0;
}
问题 C: 百鸡问题
http://codeup.cn/problem.php?cid=100000588&pid=2
#include<cstdio>
int main(void)
{
int n;
double sum=0;
while( scanf("%d",&n) != EOF )
{
for(int i=0;i<=100;i++)
{
for(int j=0;j<=100;j++)
{
for(int z=0;z<=100;z++)
{
sum=i*5+j*3+z*(1/3.0);
if(sum<=n&&(i+j+z==100))
printf("x=%d,y=%d,z=%d\n",i,j,z);
}
}
}
}
}
问题 D: abc
http://codeup.cn/problem.php?cid=100000588&pid=3
#include<cstdio>
int main(void)
{
for(int i=0;i<=9;i++)
{
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
int sum1=i*100+j*10+k;
int sum2=j*100+k*11;
if(sum1+sum2==532)
{
printf("%d %d %d\n",i,j,k);
}
}
}
}
return 0;
}
问题 E: 众数
http://codeup.cn/problem.php?cid=100000588&pid=4
#include<cstdio>
int main(void)
{
int a[11]={0};
int number;
int index;
while( scanf("%d",&number) != EOF )
{
a[number]++;
for(int i=0;i<19;i++)
{
scanf("%d",&number);
a[number]++;
}
int max=-1;
for(int i=1;i<=10;i++)
{
if(a[i]>max)
{
max=a[i];
index=i;
}
a[i]=0;
}
printf("%d\n",index);
}
return 0;
}
问题 F: 计算两个矩阵的乘积
http://codeup.cn/problem.php?cid=100000588&pid=5
#include<cstdio>
int main(void)
{
int a[2][3]={0};
int b[3][2]={0};
int sum1,sum2,sum3,sum4;
while( scanf("%d",&a[0][0]) != EOF )
{
scanf("%d",&a[0][1]);
scanf("%d",&a[0][2]);
for(int i=0;i<3;i++)
{
scanf("%d",&a[1][i]);
}
for(int i=0;i<3;i++)
{
for(int j=0;j<2;j++)
{
scanf("%d",&b[i][j]);
}
}
sum1=0;
for(int i=0;i<3;i++)
{
sum1=sum1+a[0][i]*b[i][0];
}
sum2=0;
for(int i=0;i<3;i++)
{
sum2=sum2+a[0][i]*b[i][1];
}
sum3=0;
for(int i=0;i<3;i++)
{
sum3=sum3+a[1][i]*b[i][0];
}
sum4=0;
for(int i=0;i<3;i++)
{
sum4=sum4+a[1][i]*b[i][1];
}
printf("%d %d\n%d %d\n",sum1,sum2,sum3,sum4);
}
return 0;
}
问题 G: 加法等式
http://codeup.cn/problem.php?cid=100000588&pid=6
#include<cstdio>
int main(void)
{
for(int i=0;i<=9;i++)
{
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
int sum1=i*100+j*10+k;
int sum2=j*100+k*11;
if(sum1+sum2==532)
{
printf("%d %d %d\n",i,j,k);
}
}
}
}
return 0;
}
问题 H: 整数和
http://codeup.cn/problem.php?cid=100000588&pid=7
#include<cstdio>
#include<cmath>
int main(void)
{
int N,n;
while(scanf("%d",&n) != EOF )
{
while(n)
{
scanf("%d",&N);
int sum=0;
for(int i=abs(N);i<=2*abs(N);i++)
{
sum=sum+i;
}
if(N<0)
{
sum=sum*-1;
}
printf("%d\n",sum);
n--;
}
}
return 0;
}
问题 I: 反序相等
http://codeup.cn/problem.php?cid=100000588&pid=8
#include<stdio.h>
int main(void)
{
for(int i=1000;i<=9999;i++)
{
int sum=i*9;
int sum2=0;
int temp=i;
int a[5]={0};
if(sum>9999)
continue;
int j=0;
while(temp)
{
a[j]=temp%10;
j++;
temp=temp/10;
}
sum2=a[0]*1000+a[1]*100+a[2]*10+a[3];
if(sum2==sum)
printf("%d\n",i);
}
return 0;
}
问题 J: 多项式的值
http://codeup.cn/problem.php?cid=100000588&pid=9
#include<cstdio>
#include<cmath>
int F(int a[],int max,int x)
{
int sum=0;
int m=max;
for(int i=0;i<=max;i++)
{
sum=sum*x+a[m--];
}
return sum;
}
int main(void)
{
int n;
scanf("%d",&n);
{
while(n)
{
int max;
int a[15]={0};
scanf("%d",&max);
for(int i=0;i<=max;i++)
{
scanf("%d",&a[i]);
}
int x;
scanf("%d",&x);
printf("%d\n",F(a,max,x));
n--;
}
}
return 0;
}
问题 K: 迭代求立方根
http://codeup.cn/problem.php?cid=100000588&pid=10
#include<cstdio>
#include<cmath>
double F(int x,int n)
{
double sum=x;
for(int i=1;i<=n;i++)
{
sum=sum*2/3.0+x/(3*sum*sum);
}
return sum;
}
int main(void)
{
int n,x;
while( scanf("%d %d",&x,&n) != EOF )
{
printf("%.6lf\n",F(x,n));
}
return 0;
}
问题 L: 与7无关的数
http://codeup.cn/problem.php?cid=100000588&pid=11
#include<cstdio>
#include<cmath>
bool judge(int n)
{
if(n%7==0)
return false;
while(n)
{
if(n%10==7)
return false;
n=n/10;
}
return true;
}
int main(void)
{
int n;
while( scanf("%d",&n) != EOF )
{
int sum=0;
for(int i=1;i<=n;i++)
{
if(judge(i))
sum+=i*i;
}
printf("%d\n",sum);
}
return 0;
}
问题 M: 鸡兔同笼
http://codeup.cn/problem.php?cid=100000588&pid=12
#include<cstdio>
#include<cmath>
int main(void)
{
int n;
while( scanf("%d",&n) != EOF )
{
while(n)
{
int N;
scanf("%d",&N);
int max,min;
max=min=0;
if(N%2==0)
{
max=N/2;
if(N%4)
min=N/4+1;
else
min=N/4;
}
printf("%d %d\n",min,max);
n--;
}
}
return 0;
}