C/C++の宿題を片付けます 77代目
■ このスレッドは過去ログ倉庫に格納されています
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html
【前スレ】
C/C++の宿題を片付けます 76代目
http://pc8.2ch.net/test/read.cgi/tech/1162771475/
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=2&H=&view=table&D=tech&shw=2000
0002デフォルトの名無しさん
2006/11/21(火) 12:29:120003デフォルトの名無しさん
2006/11/21(火) 13:51:13[2] 問題文:1から1000までの数値のうち、素数だけを抜き出して表示するプログラムを作成せよ。
ここでは、素数であるか否かを判定する関数を作成して使用すること。
《実行例》
1 2 3 5 7 11 13 17 19 23
29 31 37 41 43 47 53 59 61 67
71 73 79 83 89 97 101 103 107 109
113 127 131 137 139 149 151 157 163 167
173 179 181 191 193 197 199 211 223 227
229 233 239 241 251 257 263 269 271 277
281 283 293 307 311 313 317 331 337 347
349 353 359 367 373 379 383 389 397 401
409 419 421 431 433 439 443 449 457 461
463 467 479 487 491 499 503 509 521 523
541 547 557 563 569 571 577 587 593 599
601 607 613 617 619 631 641 643 647 653
659 661 673 677 683 691 701 709 719 727
733 739 743 751 757 761 769 773 787 797
809 811 821 823 827 829 839 853 857 859
863 877 881 883 887 907 911 919 929 937
941 947 953 967 971 977 983 991 997
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:gcc
[3.3] 言語:C
[4] 期限:できるだけ早くお願いします。
[5] その他の制限:自分で作ったものでsqrt()ライブラリ関数を使ったのですが、ライブラリ関数は使わず&簡単なプログラムでお願いします。
0004デフォルトの名無しさん
2006/11/21(火) 13:58:25エラ姫の櫛は使った方がいいの?
0005デフォルトの名無しさん
2006/11/21(火) 13:59:52・1は素数じゃない。
・自分で作ったプログラムを晒せ。sqrt()を使わないようにするだけならごく簡単な修正で済むはずだ。
0006デフォルトの名無しさん
2006/11/21(火) 14:00:231って素数なの?
0007デフォルトの名無しさん
2006/11/21(火) 14:01:000008デフォルトの名無しさん
2006/11/21(火) 14:03:22出力はインラインアセンブラか・・・欝だ・・・
00093
2006/11/21(火) 14:11:25期限はだいたいなんですけど、きょう辺りにできれば・・・と思います。
0010デフォルトの名無しさん
2006/11/21(火) 14:13:56int IsPrime(int n){
int i;
if(n<2)
return 0;
else if(n==2)
return 1;
if(n%2==0)
return 0;
for(i=3;i*i<=n;i+=2)
if(n%i==0)
return 0;
return 1;}
int main(){int i,j=1;for(i=1;i<=1000;i++)
if(IsPrime(i)){printf("%3d ",i);if(j%10==0)printf("\n");j++;}return 0;}
空気読まずに貼ってみる。素数判定はWikipediaのコピペだ
0011デフォルトの名無しさん
2006/11/21(火) 14:51:49int main(void){
int i, j, k, n, a;
int **p;
printf("please input! n = ");
scanf("%d\n",a);
p = (int **) malloc(sizeof(int *)*a);
for(i=0; i<=a; i++){
p[i]=(int*) malloc(sizeof(int *)*a);
for(i=0; i<=a; i++)
p[i][j]=0;
}
k = n*n-1;
for(i=0; i<n/2+n%2; i++) {
for(j=i; j<=n-i-1; j++) p[i][j] = k--;
for(j=i+1; j<n-i-1; j++) p[j][n-i-1] = k--;
for(j=n-i-1; j>i; j--) p[n-i-1][j] = k--;
for(j=n-i-1; j>i; j--) p[j][i] = k--;
}
for(i=0; i<a; i++)
printf("\n");
for(j=0; j<a; j++)
printf("%5d",p[i][j]);
return 0;
}
上記のプログラムは前スレ>>507を完成させたものですが、セグメンテーション違反になります。
どうすればいいでしょうか?
0013デフォルトの名無しさん
2006/11/21(火) 14:59:20スレ違い。
・scanf()の引き数間違い
・2番目のmalloc()の引き数間違い
0014デフォルトの名無しさん
2006/11/21(火) 15:02:08scanf("%d\n",a); <- ここがあやしい
0015デフォルトの名無しさん
2006/11/21(火) 15:10:05#include<stdio.h>
#include<stdlib.h>
int is_minus_one(int value[], int n, int x, int y){
if(x<0 || x>=n || y<0 || y>=n) return 0;
return (value[n*y+x]==-1);
}
int main(void){
int dx_list[]={ 1, 0,-1, 0};
int dy_list[]={ 0, 1, 0,-1};
int x=0, y=0, dx, dy, i, j, n=5, direction=0;
int *value;
value=malloc(sizeof(int)*n*n);
for(i=0;i<n*n;i++) value[i]=-1;
dx=dx_list[direction];dy=dy_list[direction];
for(i=0;i<n*n;i++){
value[n*y+x]=i;
if(!is_minus_one(value, n, x+dx, y+dy)){
direction=(direction+1)%4;
dx=dx_list[direction];dy=dy_list[direction];
}
x+=dx;y+=dy;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf(" %3d", value[n*i+j]);
printf("\n");
}
free(value);
return 0;
}
別解。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int prime[]={2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37,
41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89,
97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223,
227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281,
283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,
367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433,
439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503,
509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593,
599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659,
661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743,
751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827,
829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911,
919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, };
int isPrime(int n){if(n<=1000){int i;for(i=0;prime[i]<=n;i++)if (n==prime[i]) return 1;}return 0;}
int main(){int i,j=1;for(i=1;i<=1000;i++) if(isPrime(i)){
printf("%3d ",i);if(j%10==0)printf("\n");j++;}return 0;}
0017デフォルトの名無しさん
2006/11/21(火) 15:43:18[2] 問題文(含コード&リンク): nの値を12とし、nの近似値を求めるプログラムを作成せよ。詳しくは、リンク先の画像をご覧ください。
http://up.kabubu.net/cgi/img2/16802.jpg
[3] 環境
[3.1] OS: Win XP HOME
[3.2] コンパイラ名とバージョン:Microsoft Visual C++ 2005 Express Edition
[3.3] 言語: C++
[4] 期限: 本日中にできればありがたいです。。。
よろしくお願いします。
0018デフォルトの名無しさん
2006/11/21(火) 15:54:47これを参考に。
http://pc8.2ch.net/test/read.cgi/tech/1153542424/210
0019デフォルトの名無しさん
2006/11/21(火) 16:13:22#include<stdio.h>
int kaijo(int n){
if(n<2)return 1;
return n*kaijo(n-1);}
int main(){
int n,k;double e=1;
printf(" n n! 1/n! e 誤差\n");
for(n=1;n<=12;n++){
k=kaijo(n);e+=1./k;
printf("%2d %9d %.10f %.10f %.10f\n",n,k,1./k,e,2.7182818285-e);}}
0020デフォルトの名無しさん
2006/11/21(火) 16:31:50printf("12");でいいじゃん
0021デフォルトの名無しさん
2006/11/21(火) 17:45:04nを入力するのに、なんでnじゃなくてaに入れるんだ。
0022デフォルトの名無しさん
2006/11/21(火) 18:05:230で埋めてるつもりなんだろうがループカウンタをiにしてるせいで
未初期化のjを配列の添字にしてしまってる予感
0023デフォルトの名無しさん
2006/11/21(火) 18:09:25前スレ515は中心から外に大きくなってくと思ってたのでそこを修正
#include<stdio.h>
int main(void){
int i, j, k, n;
int **p;
printf("please input! n = ");
scanf("%d",&n);
p = (int **) malloc(sizeof(int *)*n);
for(i=0; i<n; i++) p[i]=(int*) malloc(sizeof(int)*n);
k = 0;
for(i=0; i<n/2+n%2; i++) {
for(j=i; j<=n-i-1; j++) p[i][j] = k++;
for(j=i+1; j<n-i-1; j++) p[j][n-i-1] = k++;
for(j=n-i-1; j>i; j--) p[n-i-1][j] = k++;
for(j=n-i-1; j>i; j--) p[j][i] = k++;
}
for(i=0; i<n; i++) {
for(j=0; j<n; j++) printf("%3d", p[i][j]);
putchar('\n');
}
return 0;
}
0024デフォルトの名無しさん
2006/11/21(火) 19:42:550025前スレ590
2006/11/21(火) 19:43:12俺のも見ろよ〜
再帰はいやか〜
#include <stdio.h> #define N 9 //サイズ
void print(int ary[N][N]);int right(int ary[N][N],int x,int y, int n, int past);int up(int ary[N][N],int x,int y, int n, int past);
int down(int ary[N][N],int x,int y, int n, int past);int left(int ary[N][N],int x,int y, int n, int past);void answer(int ary[N][N], int n);
int main(){ int ary[N][N] = {0}; int n = 0; answer(ary, n); print(ary); return 0;}void answer(int ary[N][N], int n){ int i,j;
for(j =0,i = 1; i <= (N/2 + 1) ; i++,j++){ n = right(ary,j,j,n, i); n = down(ary,i ,N-i,n, i); n = left(ary,N-i,N - i - 1,n, j); n = up(ary,N - i - 1,j, n,j);
}} int right(int ary[N][N],int y,int x, int n, int past){ if(x > N - past || y > N || x < 0 || y < 0)return n; ary[y][x] = n ; right(ary, y, x+1, n +1 , past );
} int down(int ary[N][N],int y,int x, int n, int past){ if(x > N || y > N - past || x < 0 || y < 0)return n; ary[y][x] = n; down(ary, y+1,x , n+1 , past );
} int left(int ary[N][N],int y,int x, int n, int past){ if(x > N || y > N || x < past || y < 0)return n; ary[y][x] = n; left(ary, y, x-1, n+1 , past );
} int up(int ary[N][N],int y,int x, int n, int past){ if(x > N || y > N || x < 0 || y <= past)return n; ary[y][x] = n; up(ary, y-1, x, n+1 , past );
} void print(int ary[N][N]){ int *p = &ary[0][0],i; for(i = 1,p = &ary[0][0]; p <= &ary[N-1][N-1]; p++,i++){ printf("%3d ", *p);
if(!(i % N))putchar('\n');}}
0026デフォルトの名無しさん
2006/11/21(火) 19:45:030027デフォルトの名無しさん
2006/11/21(火) 19:46:030028デフォルトの名無しさん
2006/11/21(火) 19:47:50[2] 問題文(含コード&リンク):中置記法で入力された数式を前置記法 及び後置記法で出力するプログラムを作る
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語: C
[4] 期限: ([2006年12月4日まで
[5] その他の制限: とくになし
0029デフォルトの名無しさん
2006/11/21(火) 19:50:28[2] 問題文
[要求仕様]
キーボードより2以上の整数を入力し、その入力した整数が2つの素数の和
として表せるかどうかを調べてその全ての組み合わせを出力し、
最後に組み合わせの数を出力するプログラムを作成せよ。また入力値が2より
小さい時には、警告として「入力ミスです。」と表示してプログラムを終了
するようにせよ。
[強制条件]
関数mainとは別に素数判定に関る関数を用いること。なお入出力は関数main
で行うこと。
[ヒント]
関数isprimeを利用するとよい。
int isprime(int n){
int i;
if(n<=1)
return0;
for(i-2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
[表示結果]
input
30
30は素数7と素数23の和です。
30は素数11と素数19の和です。
30は素数13と素数17の和です。
和が30になる2つの素数の組み合わせは3つあります。
0030デフォルトの名無しさん
2006/11/21(火) 19:51:59[3.1] OS:unix
[3.2] gcc
[3.3] 言語:C
[4] 期限: 2006年11月22日15時まで
[5] その他の制限: 関数を習い始めたばかりなのでできるだけ簡単なもの
にしていただけると嬉しいです。
0031デフォルトの名無しさん
2006/11/21(火) 20:10:11#include <stdio.h>
int isprime(int n){
int i;
if(n<=1)
return 0;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main()
{
int c=0,i,n;
printf("input\n");
scanf("%d",&n);
if(n<2){
printf("入力ミスです。\n");
return 1;
}
for(i=2; i<=n/2; i++)
if((isprime(i)==1)&&(isprime(n-i)==1)){
printf("%dは素数%dと素数%dの和です。\n",n,i,n-i);
c++;
}
printf("和が%dになる2つの素数の組み合わせは%dつあります。",n,c);
return 0;
}
■ このスレッドは過去ログ倉庫に格納されています