第一题 笔算易知结果
第二题?
第三题
注意:数据太大 int类型会溢出 由于题目要求只取四位 则 结果都%10000
就可以只取后四位 反正 加法高位也不影响低位
第四题
注意一下代码的优化 成立的条件即可 if(a)如果a 不等于零
while(a)当a 不为零 这两个直接加的都是相反的!!
while(x) x不为零值就继续循环 为零值就不再循环 所以说 while(x)==while(x==0)
最开始想的是枚举法
把所有n可能的取值范围列出来
后来发现 没必要这么麻烦
公式:
x%10:x 取最后一个值
x/10: 去掉最后一个值的x
//已解出 解法一 纯暴力 预计100行代码 注意要加上前面算过的部分
#include<stdio.h>
bool jduge(int x)
{
while(x>0)
{
int t=x%10;//取最后一位
if(t==2||t==0||t==1||t==9)
return true;
x=x/10;
}
return false;//位数全部用完之后 记得终止循环 不终止全加上去了
}
int main()
{
int cet=0;
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
if(jduge(i))
cet=cet+i;
}
printf("%d",cet);
return 0;
}
第二题 二叉树(自己看数据结构)
第三题
自己想的ac代码
但是看了解析 是求 排序后的等差数列的最大公约数
由题意知:
如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数。
求 一串数列的最大公约数
d={所有相邻整数差的最大公约数}
有序数列所有整数差必定是公差的倍数才可构成等差数列,也就是对于有序数列(a[n]-a[n-1])/d==0
都要成立才行,要使数列最短,则公差尽可能大,所以只需要求所有差值的最大公约数即可
然后 求一串数列的最大公约数 在C语言中有一个著名的方法那就是 辗转相除法
所有差值的最大公约数 使d尽量小
辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
例如,求(319,377):
∵ 319÷377=0(余319)
∴(319,377)=(377,319);
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29)
∴ (319,58)=(58,29);
∵ 58÷29=2(余0)
∴ (58,29)= 29;
∴ (319,377)=29。
可以写成右边的格式。
用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数
代码表示为
nt GCD( int a , int b )
{
int n=a%b;
whie(n != 0) //即: while(n)
{
a = b;
b = n;
n = a % b;
}
return b; //注意这里返回的是b 不是n
}(a,b)-------(b,a%b)--------(a%b,a%b(a%b))可像以下程序递归计算
#include
using namespace std;
int N,a[100005];
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main(){
cin>>N;
for(int i=0;i<N;i++){
cin>>a[i];
}
sort(a,a+N);
//求差值最大公约数
int d=a[1]-a[0];
for(int i=2;i<N;i++){
d=gcd(d,a[i]-a[i-1]);
}
if(d==0)printf("%d\n",N);
else{
printf("%d ",(a[N-1]-a[0])/d+1);
}
return 0;
}
#include<stdio.h>
int a[100000];
int b[100000];int main()
{
int n,i,j;
int result;
int temp;
int lastresult;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
{
for(j=1;j<n;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}//从小到大排序完成
for(j=1;j<n;j++)
{
result=a[j+1]-a[j];
b[j]=result;
}
for(i=1;i<n-1;i++)//在n-1个b[j]中选出最大的b[j];
{
for(j=1;j<n-1;j++)
{
if(b[j]>b[j+1])
{
temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
}
}
} //此时最小值为b[1];
lastresult=(a[n]-a[1])/b[1];
printf("%d",lastresult+1);
return 0;
}