学校の課題の関係上出力等を提出用にいじっています。前回のビット回転同様にプログラムには無駄が多くわかりづらい考え方をしているかもしれませんが参考にどうぞ。一応わかるようにコメント、インデントをつけていますがわかりづらいかもしれません。
#include <stdio.h>
#define N 100000
#define tn 1471821271
main()
{
int i,j,ans = 0,n = 0,nc = 0;
//n:出力数をカウント nc:素数のカウント ans:素因数分解の要素数
int sosur[N] = {0,0};
//2~100,000の数を記憶 配列0,1番目は初期値を0とする
int sosuw[N]; //素数を出力する配列
int bun[100]; //素因数分解で出た素数を格納
void sosu(int sosur[N], int sosuw[N], int dn, int *nc);
//エラトステネスの篩
void soinsu(int sosuw[N], int bun[100], int sn, int nc, int *b);
//素因数分解を計算 sn:素因数分解する数
sosu(sosur, sosuw, N, &nc); //エラトステネスの篩
//出力処理
for(j = 1 ; j <= 30; j++){ //出力配列の最初1行10個とし3行出力
printf("%6d",sosuw[j-1]);
if((j % 10) == 0){ //出力した素数が10個のとき改行
printf("\n");
}
}
printf("\n");
n = 1;
i = nc - (nc / 10) * 10; //素数の総数の1の位を取り出す
if(i==0){ //1の位が0のとき
i = 10;
}
for(j = (nc - (20+i)) ; j <nc; j++){//出力配列の最後の3行を出力
if(n == 10){ //出力した素数が10個のとき改行
printf("\n");
n = 0;
}
n += 1; //出力した素数をカウント
}
printf("\n");
printf("count:%d\n\n", nc); //素数の個数を出力
soinsu(sosuw, bun, tn, nc, &ans); //素因数分解を計算
printf("素因数分解:1471821271\n");
if(ans == 0){
printf("素因数分解できませんでした");
}
else{
for(i = 0; i <ans; i++){ //素因数分解の結果出力
}
}
}
void sosu(int sosur[N], int sosuw[N], int dn, int *nc){
//エラトステネスの篩
int i,j;
for(i = 2; i <= N; i++){ //2~100,000を配列に格納
sosur[i] = i;
}
for(i = 2; (i*i) <= N ; i++){ //エラトステネスの篩
if(sosur[i] != 0){ //配列のi番目が0のとき何もしない
for(j = 2*i; j <N; j+=i){
sosur[j] = 0;
}
}
}
for(i = 0; i <N; i++){//配列に格納されている素数を出力配列に入れる
sosuw[*nc] = sosur[i];
*nc += 1; //素数をカウント
}
}
}
void soinsu(int sosuw[N], int bun[100], int sn, int nc, int *b){
//素因数分解
int i = 0,j = 0,w,m; //m:snを割る数(素数)
int temp; //mで割られた数
temp = tn;
while(temp != 1){ //割られて1とならない間繰り返す
m = sosuw[i]; //出力配列の素数をmに代入
if((temp % m) == 0){ //割り切れたとき
temp = temp / m;
bun[j] = m; //素因数分解の要素を格納
j += 1;
i = 0;
}
if(nc == i){
j = 0;
break;
}
i += 1;
}
}
#include <stdio.h>
#define N 100000
#define tn 1471821271
main()
{
int i,j,ans = 0,n = 0,nc = 0;
//n:出力数をカウント nc:素数のカウント ans:素因数分解の要素数
int sosur[N] = {0,0};
//2~100,000の数を記憶 配列0,1番目は初期値を0とする
int sosuw[N]; //素数を出力する配列
int bun[100]; //素因数分解で出た素数を格納
void sosu(int sosur[N], int sosuw[N], int dn, int *nc);
//エラトステネスの篩
void soinsu(int sosuw[N], int bun[100], int sn, int nc, int *b);
//素因数分解を計算 sn:素因数分解する数
sosu(sosur, sosuw, N, &nc); //エラトステネスの篩
//出力処理
for(j = 1 ; j <= 30; j++){ //出力配列の最初1行10個とし3行出力
printf("%6d",sosuw[j-1]);
if((j % 10) == 0){ //出力した素数が10個のとき改行
printf("\n");
}
}
printf("\n");
n = 1;
i = nc - (nc / 10) * 10; //素数の総数の1の位を取り出す
if(i==0){ //1の位が0のとき
i = 10;
}
for(j = (nc - (20+i)) ; j <nc; j++){//出力配列の最後の3行を出力
if(n == 10){ //出力した素数が10個のとき改行
printf("\n");
n = 0;
}
n += 1; //出力した素数をカウント
}
printf("\n");
printf("count:%d\n\n", nc); //素数の個数を出力
soinsu(sosuw, bun, tn, nc, &ans); //素因数分解を計算
printf("素因数分解:1471821271\n");
if(ans == 0){
printf("素因数分解できませんでした");
}
else{
for(i = 0; i <ans; i++){ //素因数分解の結果出力
}
}
}
void sosu(int sosur[N], int sosuw[N], int dn, int *nc){
//エラトステネスの篩
int i,j;
for(i = 2; i <= N; i++){ //2~100,000を配列に格納
sosur[i] = i;
}
for(i = 2; (i*i) <= N ; i++){ //エラトステネスの篩
if(sosur[i] != 0){ //配列のi番目が0のとき何もしない
for(j = 2*i; j <N; j+=i){
sosur[j] = 0;
}
}
}
for(i = 0; i <N; i++){//配列に格納されている素数を出力配列に入れる
sosuw[*nc] = sosur[i];
*nc += 1; //素数をカウント
}
}
}
void soinsu(int sosuw[N], int bun[100], int sn, int nc, int *b){
//素因数分解
int i = 0,j = 0,w,m; //m:snを割る数(素数)
int temp; //mで割られた数
temp = tn;
while(temp != 1){ //割られて1とならない間繰り返す
m = sosuw[i]; //出力配列の素数をmに代入
if((temp % m) == 0){ //割り切れたとき
temp = temp / m;
bun[j] = m; //素因数分解の要素を格納
j += 1;
i = 0;
}
if(nc == i){
j = 0;
break;
}
i += 1;
}
}