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");
    }
}

题目链接:http://codeforces.com/contest/900/problem/B


#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值