【九度】题目1491:求1和2的个数

原创 2013年12月04日 23:04:18

题目地址:http://ac.jobdu.com/problem.php?pid=1491
时间限制:1 秒内存限制:128 兆特殊判题:否提交:697解决:199
题目描述:
给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3。输入N,求F(N)的值,1=<N<=10^100(10的100次方)若F(N)很大,则求F(N)mod20123的值。
输入:
输入包含多组测试数据,每组仅输入一个整数N。
输出:
对于每组测试数据,输出小于等于N的自然数中1和2的个数之和,且对20123取模。
样例输入:
10
11
样例输出:
3
5
提示:
建议用scanf ("%s")输入,而不建议用gets()!
来源:
2013年王道论坛研究生机试练习赛(三)
【解题思路】
这个题目分析起来和题目1373:整数中1出现的次数(从1到n整数中1出现的次数)完全一样
具体分析过程可以参考【九度】题目1373:整数中1出现的次数(从1到n整数中1出现的次数)
不同之处在于处理字符串,给出具体的代码实现。

Java AC

import java.util.Scanner;
  
public class Main {
    /*
     * 1491
     */
    private static int mod = 20123;
    private static char array[];
    private static int len;
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String input = scanner.next();
            array = input.toCharArray();
            len = array.length;
            System.out.println(modValue(calCount(1) + calCount(2)));
        }
    }
  
    private static int calCount(int num) {
        int k = len - 1;
        int factor = 1;
        int count = 0;
        while (k >= 0) {
            int lowNum = 0;
            int currNum = 0;
            int highNum = 0;
            for (int i = 0; i < k; i++) {
                highNum = modValue(modValue(highNum * 10) + (array[i] - '0'));
            }
            for (int i = k+1; i < len; i++) {
                lowNum = modValue(modValue(lowNum * 10) + array[i] - '0');
            }
            currNum = array[k] - '0';
            if (currNum < num){
                count = modValue(count + highNum * factor);
            }else if (currNum == num) {
                count = modValue(count + highNum * factor + lowNum + 1);
            }else if (currNum > num) {
                count = modValue(count + (highNum + 1) * factor);
            }
             
            factor = modValue(factor * 10);
            k--;
        }
        return count;
    }
 
    private static int modValue(int n) {
        return n % mod;
    }
}
 
/**************************************************************
    Problem: 1491
    User: wzqwsrf
    Language: Java
    Result: Accepted
    Time:130 ms
    Memory:18248 kb
****************************************************************/

C++ AC

#include <stdio.h>
#include <string.h>
 
const int mod = 20123;
int len;
int i;
char array[1000];
int modValue(int n){
    return n % mod;
}
 
int calCount(int num) {
    int k = len - 1;
    int factor = 1;
    int count = 0;
    while (k >= 0) {
        int lowNum = 0;
        int currNum = 0;
        int highNum = 0;
        for (i = 0; i < k; i++) {
            highNum = modValue(modValue(highNum * 10) + (array[i] - '0'));
        }
        for (i = k+1; i < len; i++) {
            lowNum = modValue(modValue(lowNum * 10) + array[i] - '0');
        }
        currNum = array[k] - '0';
        if (currNum < num){
            count = modValue(count + highNum * factor);
        }else if (currNum == num) {
            count = modValue(count + highNum * factor + lowNum + 1);
        }else if (currNum > num) {
            count = modValue(count + (highNum + 1) * factor);
        }
              
        factor = modValue(factor * 10);
        k--;
    }
    return count;
}
 
int main(){
     
    while(scanf("%s",&array) != EOF){
        len = strlen(array);
        printf("%d\n",modValue(calCount(1) + calCount(2)));
    }
    return 0;
}
/**************************************************************
    Problem: 1491
    User: wzqwsrf
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1020 kb
****************************************************************/
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

九度OJ 1491 清华大学2012机试 《求1和2的个数》

给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3。输入N,求F(N)的值,1= 输入: ...

九度OJ题目1491:求1和2的个数

题目1491:求1和2的个数 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:1286 解决:382 题目描述: 给定正整数N,函数F(N)表示小于等于N的自然数中1...

【九度】题目1373:整数中1出现的次数(从1到n整数中1出现的次数)

这个题其实和题目1491:求1和2的个数完全一样。 不一样的地方只是输入。一个输入的是数字,一个是字符串,处理方式完全一样。 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有...

九度 oj 题目1491:求1和2的个数

http://ac.jobdu.com/problem.php?pid=1491 参考了 1. http://www.cnblogs.com/jy02414216/archive/2011/03/...

九度OJ 题目1491:求1和2的个数

一.题目描述: 给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3。输入N,求F(N)的...
  • lhyer
  • lhyer
  • 2015-08-23 16:38
  • 269

九度OJ-题目1506:求1+2+3+...+n

题目链接地址: 九度OJ-题目1506:求1+2+3+...+n 题目描述: 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条...

题目1087:约数的个数 九度OJ

题目1087:约数的个数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:9871 解决:3285 题目描述: 输入n个整数,依次输...

九度-题目1202:排序 对输入的n个数进行排序并输出

闲来无事,做点题打发打发时间,在九度上从前到后按照难易度来做,一道排序题,用了sort函数,算是投机取巧,不过对于小题应该可以,练练题,虽然巨简单,不过摆正态度,一题一题来,(直接做lintcode和...

1.将数组A中的内容和数组B中的内容进行交换。(数组一样大) 2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。 3.将三个数按从大到小输出。 4.求两个数的最大公约数。

#define _CRT_SECURE_NO_WARNINGS 1 #include #include //1.将数组A中的内容和数组B中的内容进行交换。(数组一样大) //void swap...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)