我必须更改我的号码最后一位和第一位,但不使用仅具有整数或循环的函数。例如从 12345 到 52341

Posted

技术标签:

【中文标题】我必须更改我的号码最后一位和第一位,但不使用仅具有整数或循环的函数。例如从 12345 到 52341【英文标题】:I have to change my number last digit and first digit but without using functions only with integers or loops. For example from 12345 to 52341 【发布时间】:2019-11-09 11:15:05 【问题描述】:
#include <iostream>
using namespace std;
int main()

// Here I seperate my number because at first I have to seperate and then I have to change the first digit and last digit.
    int numri, shifrat, i = 0, a, shuma = 0, m, d;
    cout << "Jep nje numer \n";
    cin >> numri;
    m = numri;
    while (numri != 0) 
        i++;
        numri = numri / 10;     
    
    d = pow(10, i - 1);
    numri = m; 
    while (numri != 0) 
        shifrat = numri / d;
        cout << shifrat << "  ";
        numri = numri % d;
        d = d / 10;
    

//Now after that I have to change the last digit and first digit. Please help me.
//But I'm not allowed to use functions or swap only integers and loops or conditions.

    cin.get();

有人可以帮帮我吗?

【问题讨论】:

你知道如何在纸上做吗?如果你有一个带有数字xy和一个数字z的数字,你需要什么数学运算才能得到数字xyz 这就是我需要知道的。你能解释一下吗? @Hana 如果创建的数字的值大于最大整数会怎样?例如 1000123039,因此数字是 9000123031?结果不适合 32 位整数。谁分配给你的没有考虑溢出? 【参考方案1】:

它更多的是关于数学而不是其他任何东西。

要获得整数的最后一位,我们可以使用模数:

z = abc....xyz % 10

从我们使用的数字中“删除”那个数字

abc...xy =  abc...xyz / 10

(其中/表示整数除法,即34/10 == 3)。

我认为这是您已经知道该怎么做的事情。与其深入研究代码,不如先对缺失的部分进行数学计算。

将数字添加到整数中

abc...xyz = (abc...xy * 10) + z

现在你才拥有开始编写代码所需的所有部分:

int main() 
    int inp;
    int outp = 0;
    std::cin >> inp;      // read_input
    while(inp > 0)       // reverse
         int digit = ...  // get_digit
         inp = ...        // remove_digit
         outp = ...       // add_digit
    
    std::cout << outp;

很遗憾,您不能使用函数。接下来的一课应该是函数在命名和明确代码方面比 cmets 好得多

int read_input();
int remove_digit(int x); 
int add_digit(int x,int digit);
int reverse(int x);

int main() 
    int inp = read_input();
    std::cout << reverse(inp);

【讨论】:

可以,但我不能使用函数 @Hana 对不起,我错过了你标题中的“没有功能”,编辑了答案【参考方案2】:

不使用pow函数也可以编写程序。

你来了。

#include <iostream>

int main() 

    while ( true )
    
        std::cout << "Enter a non-negative number (0 - exit): ";

        unsigned int n;

        if ( not ( std::cin >> n ) or n == 0 ) break;

        std::cout << '\n';

        const unsigned int Base = 10;

        unsigned int factor = 1;

        while ( not ( n / factor < Base ) ) factor *= Base;

        unsigned int last_digit = n / factor;
        unsigned int first_digit = n % Base;

        n %= factor;

        n = n - first_digit + last_digit;

        first_digit *= factor;

        n = first_digit + n;

        std::cout << n << "\n\n";
    

    return 0;

程序输出可能看起来像

Enter a non-negative number (0 - exit): 987654321

187654329

Enter a non-negative number (0 - exit): 12345

52341

Enter a non-negative number (0 - exit): 100

1

Enter a non-negative number (0 - exit): 1

1

Enter a non-negative number (0 - exit): 0

如果这些陈述

if ( not ( std::cin >> n ) or n == 0 ) break;

while ( not ( n / factor < Base ) ) factor *= Base;

包含你还不知道的符号,然后你可以像这样重写它们

if ( !( std::cin >> n ) || n == 0 ) break;

while ( !( n / factor < Base ) ) factor *= Base;

【讨论】:

不使用 not 怎么写: if ( not ( std::cin >> n ) or n == 0 ) break;这 @Hana 你为什么不喜欢“不”?:) 你可以像 if ( ! ( std::cin >> n ) || n == 0 ) break;而这个 while ( not ( n / factor 因为我不被允许。 @Hana 为什么不允许?!谁说的?【参考方案3】:

您可以创建一个包含 4 个变量的程序 - n,给定数字,cn - 创建的数字,u - 给定数字的最后一位数字和 p - 10^p 数字; 您将保存最后 n 位并在其中创建 10^p 数字。然后,使用公式

   cn = ((u * p + cn % p) /10) * 10 + n;

您将创建新号码;

#include <iostream>
using namespace std;

int main() 

int n, cn, u, p;

cin>>n;

u = n % 10;
cn = n;
p = 1;

while(n>9) 
p = p * 10;
n = n / 10;


cn = ((u * p + cn % p) /10) * 10 + n;

cout<<cn;
return 0;

【讨论】:

此解决方案可能会导致溢出。请参阅我在主要部分中的评论。 他只用整数指定。 在上面的主要部分中再次查看我的评论以及示例——输入适合 32 位 int,但输出不适合。它只使用整数,但会产生溢出。这应该很明显,但我想不是。【参考方案4】:

交换数字ABCDEF中的第一位和最后一位数字--> FBCDEA

数字 = 12345 资源 = 52341

这个想法是:

52341 = 12345 - 10005 + 50001

第一个数字 fd = num % 10

小数位乘数 df = 1

until num is not zero we do
last digit ld = num
num = num / 10
if num != 0 decimal places multiplier df = df*10

结果 = ABCDEF - F - A*100000 + A + F*100000

int m = numri;
int ld = 0; // last digit(most)
int fd = numri % 10; // first digit(least)
int df = 1; // last digit multiplier 10^n where n is decimal places
while (numri != 0) 
    ld = numri;// this will be the last digit in last iteration
    numri = numri / 10;
    if(numri) df = df * 10;

int res = m - fd - ld * df + fd * df + ld;
cout<<res;

示例:

if the num = 12345

fd = 12345 % 10 =5
df = 1

num = 12345 / 10 = 1234
df = df*10 = 10

num = 1234 / 10 = 123
df = df*10 = 100

num = 123 / 10 = 12
df = df*10 = 1000

fd = num = 12
num = 12 / 10 = 1
df = df*10 = 10000

fd = num = 1
num = 1/10 =0
df not changed
loop exit

result = 12345 - 5  - 1*10000 + 1 + 5*10000 = 62341

【讨论】:

最后我必须在哪里写这个? 请添加一些上下文并解释这段代码的作用。只是给 OP 一些代码来复制和粘贴不会有太大帮助,特别是如果这是一些评估。如果 OP 对 c++ 来说真的很新,那就更是如此。 这段代码只是将数字分开,例如 12345 到 1 2 3 4 5。现在我必须用第一个数字更改最后一个数字。 res 不工作它显示相同的数字而不改变任何东西。 其实没有,你能解释一下吗

以上是关于我必须更改我的号码最后一位和第一位,但不使用仅具有整数或循环的函数。例如从 12345 到 52341的主要内容,如果未能解决你的问题,请参考以下文章

C语言试题160之某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交换,第二位和第三位

字符串除了第一位和最后一位中间用*替换

JAVA常见算法题(三十四)---计算加密之后的电话号码

从电话号码字符串条目中删除所有特殊字符,除了 + 仅出现在第一位 [关闭]

车牌号校验规则

简单易懂的冒泡排序