洛谷OJP1980计数问题试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9) 共出现了多少次?

本文介绍了一种计算在1到n范围内指定数字x出现次数的方法。提供了两种编程实现方案,一种使用Java,另一种使用C++。Java实现通过字符串操作来遍历每个数字,而C++实现则采用数字操作的方法。

题目描述

试计算在区间 1 到 n 的所有整数中,数字 x(0 ≤ x ≤ 9) 共出现了多少次?例如,在 1 到 11 中,即在 1,2,3,4,5,6,7,8,9,10,11中,数字 1 出现了 4 次。

输入输出格式

输入格式:

2 个整数 n,x ,之间用一个空格隔开。

输出格式:

1 个整数,表示 x 出现的次数。

输入输出样例

输入样例#1:

11 1

输出样例#1:

4

说明

对于 100\%100% 的数据, 1≤ n ≤ 1,000,000,0 ≤ x ≤ 91≤n≤1,000,000,0≤x≤9 。

AC代码(两种方法)

第一种(JAVA实现)

import java.util.Scanner;

public class Main {

    public static void main(String[] args)
    {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int x=in.nextInt();
        String strx=String.valueOf(x);
        char cx=strx.charAt(0);//将整数变换成字符
        int total=0;
        for(int i=1;i<=n;i++)
        {
            String str=String.valueOf(i);//将整数变换为字符串

            for(int j=0;j<str.length();j++)
            {
                if(str.charAt(j)==cx) total++; //遍历字符串中的每一个字符
            }
        }
        System.out.println(total);
    }

}

第二种方法(C++实现)

#include<iostream>
using namespace std;
int main()
{
    long long n,i,x,b,c,t=0;
    cin>>n>>x;//输入范围与要查的数字;
    for(i=1;i<=n;i++)//一到n进行循环;
    {
        b=i;//为了不改变i的值,就把i赋值给一个数;
        while(b!=0)//如果b不等于0,继续循环;
        {
            c=b%10;//求是否是x,是的话计数器加一;
            b=b/10;//求下一个数字是否为x;
            if(c==x) t++;计数器加一;
        }
    }
    cout<<t<<endl;//输出计数器的数字;
    return 0;//结束
}
### 南信大OJP平台大数相加解决方案 对于处理超出标准整型范围的大数运算,通常采用字符数组来存储这些数值。通过逐位计算并处理进位的方式实现两数之和。 #### 字符串表示法 由于C语言中的`int`类型无法容纳非常大的数字,在解决此类问题时,应考虑使用字符串形式保存数据[^1]。这样不仅能够支持任意长度的数字输入,还便于按位操作每一位上的值。 #### 进位机制 当执行加法过程中某一位的结果超过9,则需向更高位传递额外的一位(即所谓的“进位”)。具体来说就是当前位保留个位数部分作为最终结果的一部分,而十位及以上则累加到下一次迭代中对应的高一位置上。 下面是基于上述思路编写的用于完成两个超长整数相加功能的一个简单版本: ```c #include <stdio.h> #include <string.h> void reverse(char *str, int length){ char temp; for (int i = 0; i < length / 2; ++i) { temp = str[i]; str[i] = str[length - i - 1]; str[length - i - 1] = temp; } } // Function to add two numbers represented as strings. char* addStrings(const char *num1, const char *num2) { static char result[500]; // Assuming maximum size of input is less than or equal to this limit int len1 = strlen(num1); int len2 = strlen(num2); int maxLength = (len1 > len2 ? len1 : len2)+1; memset(result,&#39;0&#39;,maxLength); // Initialize all elements with &#39;0&#39; reverse((char*)num1,len1); reverse((char*)num2,len2); int carry = 0; for(int i=0;i<maxLength || carry>0;++i){ if(i<len1 && i<len2){ int sum=(num1[i]-&#39;0&#39;)+(num2[i]-&#39;0&#39;)+carry; result[i]=(sum%10)+&#39;0&#39;; carry=sum/10; }else{ if(i>=len1&&i<len2){ int sum=num2[i]-&#39;0&#39;+carry; result[i]=sum%10+&#39;0&#39;; carry=sum/10; }if(i<len1&&i>=len2){ int sum=num1[i]-&#39;0&#39;+carry; result[i]=sum%10+&#39;0&#39;; carry=sum/10; }else{ if(carry!=0){ result[i]=&#39;1&#39;; break; } } } } reverse(result,maxLength); while(strlen(result)>1 && result[strlen(result)-1]==&#39;0&#39;){ result[strlen(result)-1]=&#39;\0&#39;; // Remove trailing zeros except the last one which indicates zero value itself } return result; } ``` 此函数接受两个参数分别为待相加大数的字符串表达,并返回它们之间求和后的结果同样是以字符串的形式给出。注意这里假设了最大可能的输出不会超过预设缓冲区大小(`result`),实际应用当中应当根据具体情况调整该上限以防止溢出风险。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩飞雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值