c語言循環節
A. 給個c語言代碼我,是求素數p的倒數循環節長度達到p-1的數。
//以下是我編的 只需修改 Max 後面 的數值就可以
#include <stdio.h>
#include <memory.h>
#include <math.h>
#define Max 1000 // Max=1000,可以修改這個1000,就是你需要輸入的數。
int main(void)
{
find_prime_number(); //找 Max 以內的素數p, 然後算倒數的循環節,最後判斷是否為p-1
return 0;
}
int find_prime_number() //找 Max 以內的素數
{
int num,i,check;
num=2;
while(num<=Max){
i=2;
while(i<=sqrt(num)){
if(num%i==0) break;
i++;
}
if(i>=sqrt(num)) find_recurring_decimal(num);
num++;
}
}
int find_recurring_decimal(int b) // 對質數找循環小數
{
int tempa,tempb,t,count;
int a=1;
int used[Max];//b <= Max-1
memset(used, 0, sizeof(used));
tempa=a;
tempb=b;
a=a%b;//求可以得到小數的部分
//需要的是找到第一次有相同餘數的出現
//a=0是結束標志,先將敗差a置為重復察賣皮出現,然後每次a = a*10%b求出新得的余數,
//並檢查該余數是否出現過,配物有則開始算具體的循環節,無則置為1,繼續
//默認的余數可以到999.
count=0;
used[0] = 1;
do{
used[a] = 1;
a = a*10%b;
}while(used[a] != 1);
if(a != 0){
t = a;
do{
count++;
a = a*10%b;
}while (a != t);
}
if(tempb==(count+1)) printf("素數=%d, 倒數的循環節=%d,循環余數=%d\n",tempb,count,t);
return 0;
}
B. 用C語言怎麼求循環小數的循環節
循環小數在具體實現里也有餘禪限吧 = = 那麼可以用一個數組a從十分位開始讀取讀到n-1位 假設n和第一個元素相同,那麼開始再用一個數組b讀取n和a第一個元素比較,如果比較了n-1個數都拍耐相同那就是了輸出a數組,否則將b復制到a里然後繼豎賀塵續讀取直到又出現和a數組第一個元素相同的數 重復= = 個人感覺這個思路不是最簡 歡迎大家提意見 代碼自己實現會更好
C. 用C語言怎麼求循環小數的循環節
1、判斷循環的關鍵是在確定每位小數的時候,判斷余數是否出現與之前的相同。
2、常式:
intrepetend(//求循環節的函數,返回值為循環長度,共3個參數
inta,//第一個參數為被除數
intb,//第二個參數為除數
char*Str)//第三個參數為用於存循環節每一位的數組指針
{intRem[255],//用於存余數的整型數組
Div1=a,//把被除數保存下來,因為後面可能會改變被除數的值
Div2=b;//把除數也保存下來,因為後面可能會改變除數的值
if(a==0orb==0)return0;//如果被除數或者除數為0,函數返回0值
if(Div1<0)Div1=Div1*-1;//正負並不影響求循環節,所以被除數和除數都取絕對值
if(Div2<0)Div2=Div2*-1;//正負並不影響求循環節,所以被除數和除數都取絕對值
for(;Div1*10<Div2;){Div1=Div1*10;}
/*如果被除數乘以10小於除數,就通過一個循環不斷讓被除數乘以10,直到被除數乘以10大於
或者等於被除數,這樣可以清除掉小數點後面的0.000000這些多餘的數據。*/
Rem[0]=Div1%Div2;//第一次保存余數
for(inti=0;;i++)//用一個死循環檢索小數點後面的每一位
{Div1=Rem[i]*10;//每一次的被除數都為前一次余數乘以10
Str[i]=Div1/Div2;//得到第i位小數(0為第1位,1為第2位,以此類推)
Rem[i+1]=Div1%Div2;//保存余數
if(Rem[i+1]==0)//不管小數點後第幾位,如果余數為0,說明能除盡,不會出現循環
{Str[0]=0;//循環節為0
return1;}//函數返回1,這是根據你題目中要求的,但我覺得應該設為0比較合理
for(intj=0;j<=i;j++)//再用一重循環比較之前所有的余數,確定循環節起始點
if(Rem[i+1]==Rem[j])
/*判斷是否出現循環的關鍵是判斷余數是否和之前的某一次相同。如果當前余數等於之前的某一
次余數,說明開始出現循環。循環點的起點為j,終點為i,循環長度為(i-j)+1位小數,當上述判斷為真時,就可以結束函數*/
{for(intk=0;k<=(i-j);k++)Str[k]=Str[j+k];//整理循環節數組
return(i-j)+1;}//函數返回循環長度
}
}
D. 循環節(c語言編寫,不是c++)
#include <stdio.h>
void getLoop(int n);
int main(int argc, char *argv[]) {
int n;
printf("Input a prime number:");
scanf("%d", &n);
getLoop(n);
return 0;
}
void getLoop(int n) {
int len = 0;
int i = 1;
printf("Loop:");
do {
int pad = 0;
while (i < n) {
i *= 10;
pad++;
}
if (i % n == 0)
{
printf("NOT LOOP!!!\n");
return;
}
len += pad;
for (int k = 1; k < pad; k++) {
printf("0");
}
printf("%d", i / n);
i = i % n;
} while (i != 1);
printf("\n");
printf("Len:%d\n", len);
}
E. 編寫c語言程序中,使用for循環是如何從內嵌循環終止外循環
break語句就行吧,可以設一個標致量,在外層循環檢驗後執行continue
F. C語言小數的循環部分與非循環部分
這個我提供兩種思路你看行嗎 用一個數除以另升談瞎外一個數 把商和余數吵空存放到一個結構侍老體裡面 然後沒除一次 你就比較與前面存儲的數相比較 如果有循環相同的(商和余數都相同) 就證明是循環的 否則就是不循環 (注意: 如果除數小於被除數 就一直乘10 直到大於被除數 然後繼續相除)
第二種 簡單 但是不可靠 用雙精度表示商 然後把它變成一個字元串 然後遍歷(因為精度有限 不可靠)
G. 如何求一個分數化成小數後的循環節求演算法,或者C++/C程序。
#include <stdio.h>
#include <memory.h>
int main(void)
{
int a, b, t;
int used[10000];//b < 10000
memset(used, 0, sizeof(used));
printf("輸入分子,分母:");
scanf("%d%d", &a, &b);
a %= b;//求可以得到小數的部分
//能循環就是出現余數重復出現,則只需找到第一次重復出現的余數
//0是結束標志,先將a置為重復出現,然後每次a = a*10%b求出新得的余數,並檢查該余數是否出現過,有則開始重復,無則置為1,繼續
for(used[0] = 1, used[a] = 1, a = a*10%b; used[a] != 1 ; used[a] = 1, a = a*10%b)
{
;
}
if(a == 0)
{
printf("有限小數\n");
}
else
{
t = a;
printf("循環小數,循環節:");
do
{
printf("%d", a*10/b);
a = a*10%b;
} while (a != t);
printf("\n");
}
return 0;
}
H. c語言怎樣找無限循環小數的循環體
//我研究了一下午,查了好多資料,終於搞圓敬定了
#include <stdio.h>
#include <memory.h>
#define MAX_LEN 1000
int nume; //numerator分子
int deno; //denominator分母
int quot[MAX_LEN]; //quotient商
int rem[MAX_LEN]; //remainder余數
int negative_flag; //段腔脊負數標志
void save_quot_rem() //存取商和余數
{
int i;
negative_flag = nume/(double)deno < 0 ? 1 : 0; //若是負數則標志為1
nume = nume < 0 ? -nume : nume; //若是負數則轉換為正數,下同
deno = deno < 0 ? -deno : deno;
for(i=0; i<MAX_LEN; i++)
{
quot[i] = nume/deno;
rem[i] = nume%deno;
nume = 10*rem[i];
if(!rem[i])
break;
} //for
}
//判斷是否是循環小數,若是則保存循環節起始和結束位置
int is_circu(int *start, int *end)
{
int i, j;
for(i=0; i<MAX_LEN; i++)
{
if(-1 == rem[i])
return 0;
}
for(i=0; i<MAX_LEN; i++)
{
for(j=i+1; j<MAX_LEN; j++)
{
if(rem[i] == rem[j])
{
*start = i;
*end = j;
return 1;
} //if
} //for
} //for
return 0;
}
void show_circu(int start, int end) //顯示循環小數
{
int i;
printf(negative_flag ? "-%d." : "%d.", quot[0]); //整數部分
for(i=1; i<=start; i++) //小數非循環節部分
{
printf("%d", quot[i]);
}
printf("(");
for(i=start+1; i<=end; i++) //小數循環節部分
{
printf("%d", quot[i]);
}
printf(")\n\n");
}
void show_not_circu() //顯示非循環小數
{
int i;
if(-1 == quot[1]) //無小數部分
{
printf(negative_flag ? "-%d" : "%d", quot[0]);
printf("\n\n");
return;
}
printf(negative_flag ? "-%d." : "%d.", quot[0]);
for(i=1; (i < MAX_LEN) && (-1 != quot[i]); i++) //小數部分
{
printf("%d", quot[i]);
}
printf("\n\n");
}
int main()
{
int start, end;
printf("請輸入分子和分母,用空格分開(輸入兩個0離開):\n");
while(1)
{
fflush(stdin);
scanf("%d%d", &nume, &deno);
if(!nume && !deno)
return 0;
memset(quot, -1, sizeof(quot));
memset(rem, -1, sizeof(rem));
if(!deno)
{
printf("除數不握滲能為0,請重新輸入:\n");
continue;
}
save_quot_rem();
is_circu(&start, &end) ? show_circu(start, end) : show_not_circu();
}
return 0;
}
//測試數據: 35416156 61616315
// 1 7
I. C語言中無限循環小數的問題
20/3得到整悉岩春形結果後在睜耐轉化為棗高double所以結果是6.0000
d=20.0/3;
printf("%f",d);
J. 求能找出一個循環小數循環節的C語言編程,即使最後一段循環節不完整
一個能算1024位的版本
intres[1024];
chard[1024];
voidloop(intnum,intden){
intnum0=num;
if(den){
int輪檔i=0;
num0鉛桐豎=num%den;
while(num0<den){
num0*=10;
}
while(i<1024){
intj;
if(num0%den==0){
printf("noloop ");
break;
}
d[i]='0'+num0/den;
num0=num0%den;
res[i]=num0;
for(j=槐大0;j<i;j++){
if(res[i]==res[j]){
d[i]=0;
printf("%d/%dloopis%s ",num,den,&d[j]);
return;
}
}
num0*=10;
i++;
}
}
}
intmain()
{
loop(3,53);
return0;
}