精华内容
下载资源
问答
  • 用python实现:判断键盘输入三位上百位十位个位上的数字 a=list(input("请输入三位:")) for i in range(1,4): if i==1: print('百位:',a[0]) elif i==2: print('十位:',a[1]) else: print('个位:',a...

    用python实现:判断键盘输入三位数上百位十位个位上的数字

    a=list(input("请输入三位:"))
    for i in range(1,4):
        if i==1:
            print('百位是:',a[0])
        elif i==2:
            print('十位是:',a[1])
        else:
            print('个位是:',a[2])
    
    展开全文
  • w我们要求第五二进制位数上是0还是1,那么我们可以通过运算符移位操作来进行 比如我们可以将85二进制1010101与1向左移4来做与运算 就是1010101 与 0010000做与运算,看第五是0还是1, 得出这结果,...

    比如85的二进制为1010101.

    w我们要求第五位二进制位数上是0还是1,那么我们可以通过位运算符的移位操作来进行

    比如我们可以将85的二进制1010101与1向左移4位来做与运算

    就是1010101 与 0010000做与运算,看第五位是0还是1,

    得出这个结果,我们可以将结果0010000右移4位然后将结果与1进行比较即可

    代码:

    public class Testwei{
    	public static void main(String[] args){
    		int x = 85;
    		System.out.println("x的第五位二进制位的数为:" + ((((x&(1<<4))>>4)==1)?"1":"0"));
    	}
    }

    一些位运算的心得,希望大家喜欢

    展开全文
  • //给一五位数,要求输出它位数 //并且输出每一数字...//求一个数是位数的函数 //方法:丢弃位数法(丢弃位数用 /=10) int Count(long long number) { int tmp=0; if(number == 0) { return 1; } wh...

    给一个数,求它是几位数?
    示例:
    输入:12345; 输出:5

    int Count(long long number)
    //定义一个long long类型的数是为了防止通不过数据特别大的测试用例
    {
    	int tmp=0;//统计位数,初始化为0
    	if(number == 0)//考虑数为0的情况
    	{
    		return 1;
    	}
    	while(number != 0)
    	{
    		tmp++;
    		number /= 10;//丢弃个位数字
    	}
    	return tmp;
    }
    

    代码优化

    int Count(long long number)
    {
    	int tmp=0;//统计位数,初始化为0
    	do//0的情况不用单独拿出来了
    	{
    		tmp++;
    		number/=10;//丢弃个为数字
    	}while(number!=0);
    	return tmp;
    }
    

    拓展:特殊进制的位数
    给定一个正整数,将它转化为十六进制数,它是个几位数?
    思路:丢弃十六进制数的个位数字,计数器++,直到这个十六进制数字变为0.

    示例1:
    输入:12345678
    输出:6
    解释:12345678 转成十六进制为 0x BC614E,即 6 位.

    示例 2:
    输入:0x12345678
    输出:8

    示例 3:
    输入:0X12AB34
    输出:6

    int Count(unsigned int number)
    {
    	int count=0;//统计位数
    	do
    	{
    		count++;
    		number/=16;//丢弃十六进制的个位数
    		//求几进制的位数就/=几
    	}while(number!=0);
    	return count;
    }
    

    逆序输出:使用得到个位数字再丢弃个位数字的方法
    示例:
    输入:12345 输出:5 4 3 2 1

    void ReversePrint(long long number)
    {
    	do
    	{
    		printf("%d ",number%10);//得到个位数字并打印
    		number/=10;//丢弃个位数字
    	}while(number!=0);
    	printf("\n");
    }
    

    顺序输出:得到最高位数字然后再丢弃最高位数字
    示例:
    输入:12345 输出1 2 3 4 5
    12345 5位数
    最高位: 12345/10000(10^4)
    12345%10000=2345
    10000/10=1000
    最高位:2345/1000(10^3)
    2345%1000=345
    1000/10=100

    利用循环解决该问题:

    void Print(long long number)
    {
    	if(number==0)
    	//这个判0是不能缺的,否则后面pow这个库函数里面10^0==1会形成死循环
    	{
    		printf("0\n");//如果是0打印0
    		return ;
    	}
    	int tmp=(int)pow(10.0,Count(number)-1);//这里需要用到math.h
    	while(number!=0)
    	{
    		printf("%d ",number/tmp);//输出最高位数字
    		number%=tmp;//求除最高位以外的剩余数字
    		tmp/=10;
    	}
    	printf("\n");
    }
    

    递归调用解决该问题:

    void Print(long long number)
    {
    	if(number>=10)
    	{
    		Print(number/10);//递归输出最高位数字
    	}
    	printf("%d ",number%10);//打印个位数字
    }
    
    展开全文
  • 好久没写博客了,因为感觉时间比较紧,另一方面没有心思,做的...第一步,对于数K^n-1这种形式的数,位数为n,它的各个位上,每个数0~K-1出现过的次数一样的。 于是对于数B=K^n-1,有f(B)=(B+1)*n*(0+1+2+...+K-1)/

    好久没写博客了,因为感觉时间比较紧,另一方面没有心思,做的题目比较浅也是另一方面。

    热身赛第二场被血虐了好不好,于是决定看看数位DP吧。

     

    进入正题:

     

    如题是一道经(简)典(单)的数位dp。

    第一步,对于数K^n-1这种形式的数,位数为n,它的各个位上,每个数0~K-1出现过的次数是一样的

    于是对于数B=K^n-1,有f(B)=(B+1)*n*(0+1+2+...+K-1)/K=(B+1)*n*(K-1)/2;

    程序为:

    1 LL sum1(int pre,int n,int k)
    2 {
    3     LL ret=0;
    4     LL pw=1;
    5     for(int i=0;i<n;i++) pw*=k;
    6     ret=pre*pw+pw*n*(k-1)/2;
    7     return ret;
    8 }
    View Code

    其中pre在这种情况下为0,pre是什么?我们立刻进入下一步讨论。

    第二步,由第一步的结论,我们可以引申一下。为了更形象一点,我们不妨在十进制的情况下讨论。

    现在我提出一个问题:如何计算0~49999的数它们各个位上数字之和?(K=10的前提下)

    我们根据第一步可以很容易求出[0,9999]=(9999+1)*4*(10-1)/2。

    那么还剩下[10000,19999],[20000,29999],[30000,39999],[40000,49999]该怎么求?

    仔细观察发现[10000,19999]不过是每个数都比[0,9999]多了一个为1的万位,[20000,29999]不过是每个数都比[0,9999]多了一个为2的万位,[30000,39999]不过是每个数都比[0,9999]多了一个为3的万位,依次类推...就发现了规律。

    所以此时这个与后面的数位都无关的万位,我们用i表示,万位之前没有其他的位,所以pre=0(如果对pre有点不理解,看完第三步就知道了),于是对于[i0000,i9999]这样的解就是((pre+i)*10000)+(9999+1)*4*(10-1)/2。

    那么,不难得知,求解通式即为((pre+i)*K^n)+(K^n)*n*(K-1)/2

    第三步,基于第一步和第二步的结论,已经可以求出类似于999(K=10),39999(K=10),49999(K=10)的解。

    现在又提出一个问题,对于[0,54321]我们怎么解?

    当然,先延续之前“区间划分”+“前缀”的思路,先划分为[0,9999],[10000,19999],[20000,29999],[30000,39999],[40000,49999],[50000,54321]。

    对于[0,9999],[10000,19999],[20000,29999],[30000,39999],[40000,49999]已经讨论过了,接下来讨论如何求[50000,54321]。

    这时把万位的5看作一个前缀,区间就变为了[0,4321],于是只要求前缀pre=5的[0,4321]的解,也就是递归调用第二步的方法,这样就可以求到[0,321],[0,21],[0,1]这样把所有的解相加,就是需要的答案了。

     1 LL sum2(int pre,LL n,int k)
     2 {
     3     if(n<k){
     4         LL ret=0;
     5         for(int i=0;i<=n;i++) ret+=pre+i;
     6         return ret;
     7     }
     8     LL tn=n,pw=1,ret=0;
     9     int mi=0;
    10     while(tn>=k){
    11         pw*=k;
    12         mi++;
    13         tn/=k;
    14     }
    15     for(int i=0;i<tn;i++)
    16         ret+=sum1(pre+i,mi,k);
    17     ret+=sum2(pre+tn,n-tn*pw,k);
    18     return ret;
    19 }
    View Code

     

    为了验证跑出来的数据对不对,再写一个暴力求[0,n]的程序,这查错的办法。

     1 LL check(int n,int k)
     2 {
     3     LL ret=0;
     4     int t;
     5     for(int i=1;i<=n;i++){
     6         t=i;
     7         while(t){
     8             ret+=t%k;
     9             t/=k;
    10         }
    11     }
    12     return ret;
    13 }
    View Code

     

    完整程序:

     1 #include <stdio.h>
     2 typedef long long LL;
     3 
     4 LL sum1(int pre,int n,int k)
     5 {
     6     LL ret=0;
     7     LL pw=1;
     8     for(int i=0;i<n;i++) pw*=k;
     9     ret=pre*pw+pw*n*(k-1)/2;
    10     return ret;
    11 }
    12 
    13 LL check(int n,int k)
    14 {
    15     LL ret=0;
    16     int t;
    17     for(int i=1;i<=n;i++){
    18         t=i;
    19         while(t){
    20             ret+=t%k;
    21             t/=k;
    22         }
    23     }
    24     return ret;
    25 }
    26 
    27 LL sum2(int pre,LL n,int k)
    28 {
    29     if(n<k){
    30         LL ret=0;
    31         for(int i=0;i<=n;i++) ret+=pre+i;
    32         return ret;
    33     }
    34     LL tn=n,pw=1,ret=0;
    35     int mi=0;
    36     while(tn>=k){
    37         pw*=k;
    38         mi++;
    39         tn/=k;
    40     }
    41     for(int i=0;i<tn;i++)
    42         ret+=sum1(pre+i,mi,k);
    43     ret+=sum2(pre+tn,n-tn*pw,k);
    44     return ret;
    45 }
    46 
    47 int main()
    48 {
    49     LL n;
    50     int k;
    51     while(~scanf("%I64d %d",&n,&k)){
    52         printf("%I64d\n",sum2(0,n,k));
    53         printf("%I64d\n",check(n,k));
    54     }
    55     return 0;
    56 }
    View Code

     

    展开全文
  • 案例描述:水仙花数是指一个 3 位数,它个位上的数字 3次幂之和等于它本身 例如:1^3 + 5^3+ 3^3 = 153 请利用do...while语句,求出所有3位数中水仙花 获取个位 num%10 获取十位 (num/10)%10 获取百位 num...
  • //自幂数是指一个n位数,它个位上的数字n次幂之和等于它本身。 int main() { int i; for (i = 0; i <= 100000; i++) { int sum = 0; int tmp = i; int n = 1;//数字位数 while (tmp/10) { ...
  • 方式一:(用for循环) <script type="text/javascript"> var sum= 0;... i ++) { //除去尾数9的数 if(i % 10 == 9) { continue; } sum += i; } console.log(sum); </script&g...
  • #include<stdio.h>int main(){ int i=0,count=0; char a[100]; scanf("%s",a); while(a[i]!='\0') { if((a[i]-'0')%2==0) count+=(a[i]-'0'); i++; } printf("%d",count)...
  • 输出一位数的各位上的数字

    千次阅读 2017-11-21 19:22:40
    以一个例题为例: 给一个整数,要求: ①求出他几位; ②分别输出每一位数字;...(2)主要利用“/”和“%”得到各个位的数字,例如123%10就可以得到个位数字3,如果要获取十位数字2,那 就需要123/10得到12
  • 1.操作者可以随意定义自己想输入数字个数,并可以输入比这个数更多或更少数字,但至少要输入1数字,例如: 有四数字:6、9、3、4,能组成多少互不相同且无重复数字4位数?各多少?用户可以输入4或...
  • 水仙花数是指一个N位正整数(N≥3),它个位上的数字N次幂之和等于它本身。例如:153=1^3 + 5^3 + 3^3​​ 。 本题要求编写两个函数,一个判断给定整数是否水仙花,另一个按从小到大顺序打印出给定区间(m,...
  • 即:任意一个四位数,只要它们各个位上的数字不全相同,就有这样规律: (1)将组成该四位数四个数字由大到小排列,形成由这四个数字构成最大四位数; (2)将组成该四位数四个数字由小到大排列,形成...
  • 整数在第n位上的数字记作x,如果x和n奇偶性相同,则记下一1,否则记下一个0。按照整数顺序把对应位表示奇偶性的0和1都记录下来,就形成了一二进制数字。比如,对于342315,这二进制数字就是001101。...
  • 写一函数调整arr,使arr中要么所有偶数位上偶数,要么所有数位上奇数上。 要求:如果数组长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1),下标0,2,4,6…算作偶数位,下标1,3,5,7…算作...
  • #include <bits/stdc++.h> using namespace std; void f(){ for(int a = 1; a <= 9; a++) for(int b =0; b <= 9; b++){ int num = a * 1000 + b * 100 + ... if((num - 7) % 7 == 0 &...
  • void split(int value,int array[]) //array用来存放给定整数value个位上数字数组,数组低位存储整数低位{ int count = 0; while( value != 0 ) { array[count] = value % 10; value /= 10; count++; } }
  • 题目:给一个不多于5 位正整数,要求∶ ...2.每次丢弃个位,利用n/=10循环使用 int main() { int n; int temp = 0;//计数器 scanf_s("%d", &n); if (n == 0) { printf("1"); } while(n!=0) { n /= 10;
  • 美国数学家维纳(N.Wiener)智力早熟,11岁就...“我年龄立方是个4位数。我年龄4次方是个6位数。这10数字正好包含了从0到9这10数字,每都恰好出现1次。” 请你推算一下,他当时到底有多年轻。 dainma
  • x=input('请输入一以上的数') x=int(x) if 0<x<99: print('请重新输入一以上的数') else: x=x//100 print(x)这题目用到的整除运算的思想。 同样的 我们可以举一反三: x=x//10 x=x...
  • 写一函数调整arr,使arr中要么所有偶数位上偶数,要么所有数位上奇数上。 要求:如果数组长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1),下标0,2,4,6...算作偶数位,下标1,3,5,7...算作...
  • 考虑 00000000到99999999 ...因此各个位上的的数字和 = (0+1+2+……+9)×8000 0000 因此1到 1 0000 0000,就在上述基础上再加“一亿”这个本身数字和 总和 = (0+1+2+……+9)×8000 0000 + 1 = 36 0000 0001
  • 其中number不超过长整型整数,digit为[0, 9]区间内整数。函数CountDigit应返回number中digit出现次数。 代码: int CountDigit( int number, int digit ){ int i,m,sum=0; if(number<0){ num
  • 40.在两长度相等的排序数组中找到数 题目描述 给定两有序数组arr1和arr2,已知两数组的长度都为N,求两数组中...总共有8数,第4小的数,所以返回3。 输入 [0,1,2],[3,4,5] 返回值 2 说
  • 【问题描述】:写一宏将一个数的二...【解决思路】:拿出这个数二进制中偶数位,将奇数位先置0,向左移1位,偶数位就正好在奇数位上了;拿出这个数二进制中位,将偶数位先置0,向右移1位,奇位就正好...
  • 展开全部a = 12345 取个位 : b = (a / 1) % 10 = a % 10 取十位: b = (a / 10) % 10 ...假设输入的数是5261n, n不为0 n=某数 while n>0。 (n,r) = divmod(n,10) print r 其中(n,r) = divmod(n,10) r个4102位数。n...
  • #错误做法,坐等大佬解答 sum = 0 n = int(input('请输入位数:')) for i in range(10*(n-2),10**(n-1)): k = str(i) ...利用for循环控制100-999个,每个分解出个位,十位,百位。 解法1 for a in r
  • 给出一 32 位有符号整数,你需要将这整数中每位上的数字进行反转。 示例1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 def demo(num): ''' 分种情况: ...
  • * 输入一整数,计算它各位数字和。(注意:任意位的整数) * 各位数字使用%取之相加,取十/,再次进入循环, */ int n = 1234; int sum = 0; while (n != 0) { sum += n % 10;// 取各位 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,139
精华内容 4,455
关键字:

个位上是0的数