驗證n是否可以分解為2個素數相乘,是回傳1,否回傳0;通過指標x,y回傳分解出的兩個素數
例如 111=3*37 *x=3,*y=37,函式回傳值為1
為啥出來debug assertion failed
#include<stdio.h>
#include<math.h>
int prime(int m)
{
int k,flag=1;
for(k=2;k<(int)sqrt((double)m);k++)
if(m%k==0)
flag=0;
return flag;
}
int fun(int n,int *x,int *y)
{
int k,flag=0;
int k2;
k=2;
do{
k2=n/k;
if(k*k2==n)
if(prime(k) && prime(k2) && k<k2)
{
flag=1;
*x=k;
*y=k2;
break;
}
k+=1;
}
while(k<k2);
return flag;
}
main()
{
int a,b;FILE *out ;
out = fopen("C:\\KSWJJ\\2454999999010001\\out.dat","w") ;
if(fun(111,&a,&b)) {
printf("111=%d*%d\n",a,b);
fprintf(out, "111=%d*%d\n",a,b);
}
if(fun(11111,&a,&b)) {
printf("11111=%d*%d\n",a,b);
fprintf(out, "11111=%d*%d\n",a,b);
}
if(fun(1111111,&a,&b)) {
printf("1111111=%d*%d\n",a,b);
fprintf(out,"1111111=%d*%d\n",a,b);
}
fclose(out);
getchar();
}
uj5u.com熱心網友回復:
在什么地方assert了?表示那里非法訪問了uj5u.com熱心網友回復:
a和b初始化一下試試看uj5u.com熱心網友回復:
int fun(int n,int *x,int *y){
int k,flag=0;
int k2;
k=2;
do{
k2=n/k;
if(k*k2==n)
if(prime(k) && prime(k2) && k<k2)
{
flag=1;
*x=k; //這里貌似使用了野指標,不能讓指標指向一個區域變數,因為當函式呼叫結束后會撤銷該區域變數的記憶體空間,然后你又有可能在該函式外使用該指標所指向的變數,這是不行的。
*y=k2; //這里也是
break;
}
k+=1;
}
while(k<k2);
return flag;
}
uj5u.com熱心網友回復:
main() //這里貌似應該是 int main(){
int a,b;FILE *out ;
out = fopen("C:\\KSWJJ\\2454999999010001\\out.dat","w") ;
if(fun(111,&a,&b)) {
printf("111=%d*%d\n",a,b);
fprintf(out, "111=%d*%d\n",a,b);
}
uj5u.com熱心網友回復:
main 函式是題自己有的 應該沒啥錯誤
如果是我 int fun 下面野指標得問題 應該怎么改正呢?
uj5u.com熱心網友回復:
main函式內容是題自帶的
我只編 int fun內容
uj5u.com熱心網友回復:
編譯后是正確輸出 但是會彈出 debug assertion failed
成績也是0分
uj5u.com熱心網友回復:
/*k、k2定義為靜態區域變數*/
#include<stdio.h>
#include<math.h>
int prime(int m)
{
int k,flag=1;
for(k=2;k<(int)sqrt((double)m);k++)
if(m%k==0)
flag=0;
return flag;
}
int fun(int n,int *x,int *y)
{
static int k,flag=0;
static int k2;
k=2;
do{
k2=n/k;
if(k*k2==n)
if(prime(k) && prime(k2) && k<k2)
{
flag=1;
*x=k;
*y=k2;
break;
}
k+=1;
}
while(k<k2);
return flag;
}
main()
{
int a,b;FILE *out ;
out = fopen("C:\\KSWJJ\\2454999999010001\\out.dat","w") ;
if(fun(111,&a,&b)) {
printf("111=%d*%d\n",a,b);
fprintf(out, "111=%d*%d\n",a,b);
}
if(fun(11111,&a,&b)) {
printf("11111=%d*%d\n",a,b);
fprintf(out, "11111=%d*%d\n",a,b);
}
if(fun(1111111,&a,&b)) {
printf("1111111=%d*%d\n",a,b);
fprintf(out,"1111111=%d*%d\n",a,b);
}
fclose(out);
getchar();
}
我建議用靜態區域變數,因為定義k、k2時加上 static 就是告知編譯器,將變數存盤在程式的靜態存盤區而非堆疊上空間,這樣就可以解決該函式結束后,該變數的存盤空間還沒釋放的問題。
我覺得如果你這是小程式,也可以嘗試使用全域變數,但是如果大專案,就不太推薦使用k、k2為全域變數了。因為定義一個全域變數有許多缺點,最明顯的缺點是破壞了此變數的訪問范圍(使得在此函式中定義的變數,不僅僅只受此函式控制)。
我覺得就別傳指標了...傳兩個參考過去,然后在fun函式里對對這兩個參考進行賦值,這樣就可以把主函式里被參考的變數的值改變了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/58136.html
標籤:C語言
