1.题目描述
一个很简单的题,唯一注意的是对评测用例的规模要进行考虑,最后的相加结果可能超过了int型所能表示的范围
#include<cstdio>
using namespace std;
typedef long long LL;
bool fun(int n){
while(n){
int n1 = n%10;
if(n1==0||n1==1||n1==2||n1==9){
return true;
}
n/=10;
}
return false;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
LL sum = 0;
for(int i = 1;i<=n;i++){
if(fun(i)){
sum+=(LL)i;
}
}
printf("%lld",sum);
}
return 0;
}
2.题目描述
本题思路:核心思想是求出这个等差数列的公差d,再运用公式an = a1+(n-1)*d,算出n,就是这个最短数列的项数。而对于求公差d,我是将相邻
两个元素相减的差值都存储起来,最后求他们的最大公约数,这个最大公约数就是该等差数列的公差。同时,这个数列中的数字很有可能超过int型的表示范围(2^31-1),注意在进行数组定义时,要使用long long
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn = 1e5+4;
LL a[maxn];
LL num[maxn];
//求最大公约数
LL gcd(LL m,LL n){
if(n==0)return m;
return gcd(n,m%n);
}
int main(void){
int n;
while(scanf("%d",&n)!=EOF){
int d = 0;
int index = 0;
int m = 0;
for(int i = 0;i<n;i++){
scanf("%lld",&a[i]);
}
sort(a,a+n);
//将每个元素之间的差值装入num数组
for(int i = 1;i<=n-1;i++){
num[index++] = a[i]-a[i-1];
}
//求公差的最大公约数
d = gcd(num[0],num[1]);
for(int i = 2;i<=index-1;i++){
d = gcd(num[i],d);
}
//利用公式an = a1+(n-1)*d
m = ((a[n-1]-a[0])/(int)d)+1;
printf("%d\n",m);
}
}