2800 - 万数归一
时间限制 : 1 秒
内存限制 : 128 MB
对于任一大于1的自然数,若为奇,乘3后加1;若为偶,就用2去除;对于得出的结果继续执行前面的运算,最终一定得到1。不管你信不信,编程验证一下吧。
题目输入
题目包含多组测试数据,第一行为测试数据组数N,接着是N行的正整数。
题目输出
输出验证过程中的奇数,最后得到的1不用输出;每个测试数输出一行;每行中只有两个输出之间才能有一个空格;如果没有这样的输出,则输出:No odd number
(对输出格式的说明:每行最后一个数字之后无空格。每行末尾有一个换行)
<span style="font-size:12pt;font-family:';"><br />
输入/输出样例
输入格式
3 5 9 16
输出格式
5 9 7 11 17 13 5 No odd number
C语言解答
#include<stdio.h> int main() { int a[100],b[100]; int i,x,k,m = 0; scanf("%d",&k); for(x = 0;x<k;x++) scanf("%d",&a[x]); for(x = 0;x<k;x++) { int count = 0; if(x>0) printf("\n"); for(i = 1;;i++) { if(a[x] == 1) { break; } else if(a[x]%2 == 0) a[x] = a[x]/2; else if(a[x]%2 == 1) { b[m] = i; if(b[m]>b[0]) printf(" %d",a[x]); else printf("%d",a[x]); m++; a[x] = a[x]*3+1; count = 1; } } if (count==0) printf("No odd number"); } return 0; }
C++解答
#include<iostream> using namespace std; int main() { int n,temp,i,b[100][100],k[100],t[100],a[100],j; cin>>n; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<n;i++) { t[i]=0; k[i]=0; temp=a[i]; while(temp!=1) { if(temp%2==1&&temp!=1) { b[i][t[i]]=temp; t[i]++; temp=temp*3+1; k[i]++; } else temp/=2; } if(a[i]%2==1) k[i]--; } for(i=0;i<n;i++) { if(t[i]==0) cout<<"No odd number"; else { for(j=0;j<t[i];j++) { if(j!=t[i]-1) cout<<b[i][j]<<" "; else cout<<b[i][j]; } } if(i<n-1) cout<<"\n"; } return 0; }
Java解答
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); while(n-->0){ int a = in.nextInt(); int sum=0; while(true){ if(a%2!=0&&a!=1){ System.out.print(a+" "); a=a*3+1; sum=1; } else if(a%2!=0&&a/2==1){ System.out.print(a); break; } if(a%2==0){ a=a/2; if(a==1&&sum==0){ System.out.print("No odd number"); break; } else if(a==1){ break; } } } System.out.println(); } } }