日常训练代码记录
JK学长想对整数的数字求和来找到正整数的数字根。整数根的定义如下:如果结果值是单个数字,则该数字是数字根。如果结果值包含两个或更多个数字,则对这些数字求和并重复该过程。只要需要获得一位数,这就会继续。
例如,考虑正整数24.加上2和4得到值6.由于6是单个数字,6是24的数字根。现在考虑正整数39.加上3和9的收益率12.由于12不是一个数字,因此必须重复该过程。添加1和2 yeilds 3,单个数字以及39的数字根。
Input
输入文件将包含一个正整数列表,每行一个。输入的结尾将由整数值零表示。每次输入的数据不超过10^1000。
Output
对于输入中的每个整数,在输出的单独行上输出其数字根。.
Sample Input
24
39
0
Sample Output
6
3
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
char s[1010];
int fun(char s[1010]) {
ll sum=0;
for(int i=0; s[i]!='\0'; i++) {
sum+=(s[i]-'0');
}
if(sum>=10) {
sprintf(s,"%ld",sum);
fun(s);
} else printf("%ld\n",sum);
}
int main() {
scanf("%s",s);
while(s[0]!='0') {
fun(s);
scanf("%s",s);
}
return 0;
}
/*测试样例
24
39
0
*/
给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input
5 3
3 -35 92 213 -644
Sample Output
213 92 3
Hint
请用VC/VC++提交
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
int d=500000;
int temp[1000100];
int main() {
int n,m,t;
while(~scanf("%d%d",&n,&m)) {
memset(temp,0,sizeof(temp));
for(int i=0; i<n; i++) {
scanf("%d",&t);
temp[t+d]=1;
}
for(int i=1000000; i>=0; i--) {
if(temp[i]) {
if(m>1) {
printf("%d ",i-d);
m--;
} else {
printf("%d\n",i-d);
break;
}
}
}
}
return 0;
}
/*测试样例1
5 3
3 -35 92 213 -644
*
一个正整数n,如果是奇数n=3*n+1 偶数n=n/2,直到n=1,停止执行;执行的次数是T;
求在区间[i,j]中T的最大值。
比如n=22 执行的过程为 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 总共执行了16次即T=16;
当i=4,j=6时 T(4)=3,T(5)=6,T(6)=9;所以最大值T是9.
Input
输入为多组输入,输入两个整数i,j;保证输入的数大于0小于10^6;
You can assume that no opperation overflows a 32-bit integer.
Output
每行输出三个数
i,j,T。
Sample Input
10 1
4 6
201 210
900 1000
Sample Output
10 1 20
4 6 9
201 210 89
900 1000 174
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
int fun(int n) {
int num=1;
if(n==0)
num=0;
while(n>1) {
if(n%2==0)
n/=2;
else
n=n*3+1;
num++;
}
return num;
}
int main() {
int i,j;
while(~scanf("%d%d",&i,&j)) {
int max=0,k,flag=0;
if(i>j) {
int t=i;
i=j;
j=t;
flag=1;
}
for(k=i; k<=j; k++) {
if(max<fun(k))
max=fun(k);
}
if(flag) {
int t=i;
i=j;
j=t;
}
printf("%d %d %d\n",i,j,max);
}
}
/*测试样例1
10 1
4 6
201 210
900 1000
*/
李小狗在做A+B Problem 的时候肚子饿了,于是他决定去买零食。
但是李小狗忘带钱了,好心的店主说,只要你能帮我把店里所有零食按价格从低到高排好序,就可以免费带走零食!
救救李小狗!
Input
输入包含多组测试。第一行输入一个整数T代表测试的个数,接下来的T行每一行包含一个整数N(1<=N<=1000),代表零食的种数,接下来N个数代表这N种零食的价格
Output
对每个测试,输出排好序的结果,输出时每一个测试的最后一个数后面没有空格,每输入完一组测试立马输出该组测试的答案
Sample Input
2
3 2 1 3
9 1 4 7 2 5 8 3 6 9
Sample Output
1 2 3
1 2 3 4 5 6 7 8 9
#include "bits/stdc++.h"
using namespace std;
int a[1010];
int comp(const void*a,const void*b) {
return *(int*)a-*(int*)b;
}
int main() {
int n,t;
cin>>t;
for(int k=0; k<t; k++) {
cin>>n;
for(int i=0; i<n; i++) {
cin>>a[i];
}
qsort(a,n,sizeof(int),comp);
for(int i=0; i<n-1; i++) {
cout<<a[i]<<' ';
}
cout<<a[n-1]<<endl;
}
return 0;
}
/*测试样例
2
3 2 1 3
9 1 4 7 2 5 8 3 6 9
*/
/*结果
1 2 3
1 2 3 4 5 6 7 8 9
*/
从桌子的边缘开始放置木块,木块伸出桌子长度的计算方法为ans=1/2+1/3+……1/n,现在给定你木块伸出桌子的长度,请你求出木块的个数n
Input
1.00
3.71
0.04
5.19
0.00
Output
3 card(s)
61 card(s)
1 card(s)
273 card(s)
#include "bits/stdc++.h"
using namespace std;
int main() {
double ans,sum;
int i;
do {
cin>>ans;
i=2;
sum=0;
while(ans>sum) {
sum+=1.0/(i++);
}
if(i-2!=0)printf("%d card(s)\n",i-2);
} while((ans-0.0)>0.0001);
return 0;
}
/*测试样例
1.00
3.71
0.04
5.19
0.00
*/
/*结果
3 card(s)
61 card(s)
1 card(s)
273 card(s)
*/