2011年5月31日火曜日

いつだかTwitterで話題になってたコラッツ問題の検証プログラム

手探りに手探りを重ねてつくってみた。
単独・範囲攻撃両対応/値の推移表示機能付き

syntax:collatz -s / -r x1 x2

#include <stdio.h>
#include <stdlib.h>
int collatz(unsigned long int x);


int main(int argc,char *argv[]){
unsigned long int i;
unsigned long int c;
int select;
unsigned long int x1;
unsigned long int x2;

if(argc>3){
x1=atoi(argv[2]);
x2=atoi(argv[3]);
if (x1>x2){
printf("x1 must be smaller than x2!\n");
exit(1);
}
}
else{
if(argc>2){
x1=atoi(argv[2]);
}
else{
printf("Incorrect Syntax!\nUSAGE: collatz -s/-r x1 x2(with -r option)\n");
exit(1);
}
}
if(*argv[1]=='-'){
switch (*(argv[1]+1)){
case 's':
select=0;
break;
case 'r':
select=1;
break;

default:
printf("An incorrect opption!\nUSAGE: collatz -s/-r x1 x2\n");
exit (1);
}}
else{
printf("No manipulation opption");
exit(1);
}

switch (select){
case 0:
c=collatz(x1);
printf ("%d ... COUNT:%d\n",x1,c);
break;
case 1:
for (i=x1;i<x2+1;i++){
c=collatz(i);
printf("%d ... COUNT:%d\n",i,c);
printf("--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--\n");
}
break;
}

return 0;
}




int collatz(unsigned long int x){
unsigned long int counter;
int oddoreven;
for (counter=0;x>1;counter++){
oddoreven=x%2;
if(oddoreven==0){
printf("%d\n",x);
x=x/2;
}
else{
printf("%d\n",x);
x=x*3+1;
}
}
if (x==1)
printf("%d ",x);
printf("(END)\n");
return counter;
}

0 件のコメント:

コメントを投稿