【九度】题目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 求1和2的个数

参考:题目1491:求1和2的个数 找规律,注意边界 题目描述: 给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,1...
  • ronixy
  • ronixy
  • 2014年03月01日 16:19
  • 710

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

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

题目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)的...
  • newner
  • newner
  • 2013年03月09日 22:40
  • 1532

九度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
  • 312

题目1137: 质因数的个数

题目描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。   输入 可能有多组测试...
  • SJF0115
  • SJF0115
  • 2013年03月21日 08:17
  • 4350

九度OJ 1100:最短路径 (最短路径)

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4185 解决:619 题目描述: N个城市,标号从0到N-1,M条道路,第K条道路(K从0开始)...
  • thudaliangrx
  • thudaliangrx
  • 2015年10月23日 09:29
  • 1155

51nod 1284:2 3 5 7的倍数 容斥原理

1284 2 3 5 7的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 给出一个数N,求1...
  • u010885899
  • u010885899
  • 2015年08月27日 09:59
  • 1280

求约数个数问题

题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N 接下来的1行包括N个整数,其中每个数的范围为(1 当N=0时输入结束。 输出:...
  • wangyulinyy
  • wangyulinyy
  • 2013年08月02日 23:48
  • 2601

线段树练习 2

题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Desc...
  • xiaofang3a
  • xiaofang3a
  • 2014年04月06日 22:19
  • 254

求1到N的所有整数中“1”的个数

题意:给定一个十进制的整数N,求出1到N
  • wang11234514
  • wang11234514
  • 2014年06月30日 22:17
  • 1685
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【九度】题目1491:求1和2的个数
举报原因:
原因补充:

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