您的位置:首页 > 其它

九度OJ 题目1033:继续xxx定律

2013-02-05 15:08 274 查看
/********************************* 
 *    日期:2013-2-4
 *    作者:SJF0115 
 *    题号: 九度OJ 题目1033:继续xxx定律
 *    来源:http://ac.jobdu.com/problem.php?pid=1033
 *    结果:AC 
 *    来源:2009年浙江大学计算机及软件工程研究生机试真题
 *    总结:
**********************************/ 
#include<stdio.h>
#include<string.h>

int key[1000000];//关键数 key数组要开的尽量大

int main(){
	int i,n,temp;
	int a[100000];
	
	//freopen("C:\\Users\\SJF\\Desktop\\acm.txt","r",stdin); 
	while(scanf("%d",&n) != EOF && n != 0){
		//输入数据
		for(i = 0;i < n;i++){
			scanf("%d",&a[i]);
		}
		memset(key,0,sizeof(key)); 
		for(i = 0;i < n;i++){
			temp = a[i];
			//求解覆盖数,标记为1
			while(temp != 1){
				//如果是偶数,就把temp砍掉一半
				if(temp % 2 == 0){
					temp = temp / 2;
				}
				//如果是奇数,把temp变成 3*temp+ 1后砍掉一半
				else{
					temp = (temp * 3 + 1) / 2;
				}
				//出现在求解序列中标记为1
				key[temp] = 1;
			}//while
		}//for
		int flag = 0;
		//逆序输出关键数(序列中没有标记为1的即为关键数)
		for(i = n-1;i >= 0;i--){
			if(key[a[i]] == 0){
				if(flag == 1){
					printf(" ");
				}
				printf("%d",a[i]);
				flag = 1;
			}
		}
		printf("\n");
	}
	return 0;
}


/********************************* 
 *    日期:2013-2-5
 *    作者:SJF0115 
 *    题号: 九度OJ 题目1033:继续xxx定律
 *    来源:http://ac.jobdu.com/problem.php?pid=1033
 *    结果:AC 
 *    来源:2009年浙江大学计算机及软件工程研究生机试真题
 *    总结:
**********************************/ 
#include<stdio.h>
#include<string.h>

int key[1001];
int a[500];
int main()
{
    int n,i,k;
	//freopen("C:\\Users\\SJF\\Desktop\\acm.txt","r",stdin); 
    while(scanf("%d",&n)!=EOF && n != 0)
    {
        memset(key,0,sizeof(key));
        for(i = 0;i < n;i++)
        {
            scanf("%d",&k);
            a[i]=k;
            while(k!=1)
            {
				//如果是奇数,把k变成 3*k+ 1后砍掉一半
                if(k % 2)
                {
					k = (k*3+1) / 2;
				}
				//如果是偶数,就把k砍掉一半
                else
                {
					k /= 2;
				}
				//1<a[i]<=1000
				//出现在求解序列中标记为1
                if(k <= 1000)
				{
					key[k] = 1;
				}
            }
        }
		int flag = 0;
        //逆序输出关键数(序列中没有标记为1的即为关键数)
        for(i = n-1;i >= 0;i--){
            if(key[a[i]] == 0){
                if(flag == 1){
                    printf(" ");
                }
                printf("%d",a[i]);
                flag = 1;
            }
        }
        printf("\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: