1. 程式人生 > >Codeforces Round #450 (Div. 2)+劉汝佳紫書3-8 (C語言整數模擬除法)

Codeforces Round #450 (Div. 2)+劉汝佳紫書3-8 (C語言整數模擬除法)

基本模板:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int a,b;
    int tem;
    while(~scanf("%d%d",&a,&b)){
        for(int i=0;i<15;i++){
            tem=a/b;
            a-=b*tem;
            a*=10;
            printf("%d",tem);
            if(!i)
                printf(".");
        }
        printf("\n");
    }
}

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <cstring>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std;


int main()
{
    int a,b,c;
    int tem,cnt,flag;
    while(~scanf("%d%d%d",&a,&b,&c)){
        cnt=flag=0;
        a*=10;
        for(int i=0;i<1000005;i++){
            if(a==0){
                if(c==0){
                    flag=1;
                    cnt++;
                }
                break;
            }
            tem=a/b;
            a-=b*tem;
            cnt++;
            a*=10;
            //printf("%d",tem);
            if(tem==c){
                flag=1;
                break;
            }
        }
        if(flag)
            printf("%d\n",cnt);
        else
            printf("-1\n");
    }
}

題目連結:vj上 UVa 202 自行開 即可

程式碼如下:

//即使是迴圈小數,但可能並不是從第一位小數開始迴圈,這樣在加括號和迴圈節的長度上都會出錯,WA了數次
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int rm[1010];//最後的結果陣列
int vis[1000010];//標記是否出現過,儲存的是第一次出現的位置k
int rec[1000010];//第k次出現時,被除數a的值
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        memset(vis,0,sizeof(vis));
        memset(rec,0,sizeof(rec));
        printf("%d/%d = %d",a,b,a/b);
        a=a%b;
        int k=1;
        while(!vis[a]&&a)//如果訪問過了,說明是迴圈小數,否則存在不迴圈的解
        {
            vis[a]=k;
            rec[k]=a;
            a=a*10;
            rm[k++]=a/b;
            a=a%b;
        }
        printf(".");
        for(int i=1;i<k&&i<=50;++i)
        {
            if(a&&a==rec[i])//當從這個數開始迴圈的時候再加括號,只擴出迴圈部分
                printf("(");
            printf("%d",rm[i]);
        }
        if(!a)
            printf("(0");
        if(k>50)
            printf("...");
        printf(")\n");
        printf("   %d = number of digits in repeating cycle\n",a?(k-vis[a]):1);//k減去迴圈起始位置
    }
    
    return 0;
}