PDA

View Full Version : Tối ưu Code nhập số nguyên dương rồi đảo ngược số nguyên dương vừa nhập trong C



tyrant
29-09-2011, 12:31 PM
em có bài nhập vào số nguyên dương Vd : 1234--> xuất 4321

Code của em :



int DaoSo( int n )
{
int m =0 ;
int dv ;
while ( n!=0)
{
dv=n%10 ;
n=n/10 ;
m=m*10+dv ;
}
return m ;
}


Code chạy tốt khi nhập 1 số mà không có số 0 ở đầu hay ở cuối ( ví dụ : 3567 )

Nhưng nếu nhập số 0 và . Ví dụ ( 5430 --> chỉ ra 345 hoặc 0345 --> 543 )

hướng giải của em là tách từng số ra lấy số dư n%10 , in số dư đó , rồi cho n /10 , kiếm tra điều kiện nếu n !=0 thì tiếp tục in ra . Cách này code chạy ổn khi nhập 0 nhưng sai yêu cầu đề

Vấn đề nằm ở cho đề bài không cho sử dụng chuỗi , không sử dụng biến trung gian để lưu trữ . Tìm cách để N giữ nguyên giá trị bằng 1 phép tính toán nào đó ( + , - , * , / chẳng hạn )

em đã nghĩ mấy ngày vẫn chưa tìm ra , mọi người cho em ý kiến . Thanks all

VoTichSu
29-09-2011, 02:02 PM
Nếu chỉ thuần số thì có thể dùng mẹo chèn thêm vào cuối số một ký tự số cho biết số có bao nhiêu số 0 đi trước

vd
số 534 sẽ trở thành 5340; 79157 sẽ thành 791570 (không có 0 dẫn đầu)
số 0534 sẽ trở thành 5341 (1 số không ở đầu); 0079157 sẽ thành 791572 (2 số không ở đầu)
số 05340 sẽ trở thành 53401 (1 số không ở đầu); 7915700 sẽ thành 79157000 (không có 0 dẫn đầu)
Các con toán sẽ dùng %10 để biết số này có bao nhiêu 0 ở đầu và /10 để biết thực trị số này.

Tuy nhiên, mẹo nào cũng không thể thoát qua khi nhập số, các hàm nhập số đều bỏ đi các số 0 dẫn đầu.
Ngoài việc sử dụng chuỗi (hoặc ký tự qua hàm nhập getch), không có cách nào để biết được là người dùng nhập vào 0123 thay vì 123

nguyenphuongcntv
29-09-2011, 08:44 PM
#include <stdio.h>
#include <conio.h>
long DaoSo( long n );
int main()
{
long n=54300;//thay cho lenh nhap va kiem tra dieu kien nhap

while (n%10==0)
{
printf("0");
n/=10;
}
printf("%ld",DaoSo(n));
getch();
return 0;
}
long DaoSo( long n )
{
long m =0 ;
int dv ;
while ( n!=0)
{
dv=(int)n%10 ;
n=n/10 ;
m=m*10+dv ;
}
return m ;
}
code này chỉ đổi số có dạng 54300 ==> 00345
còn trường hợp 00345 ==> 54300 thì mình không biết

yo_yo12
17-10-2011, 06:42 AM
ai biết viết code bài này bằng đệ quy không ???
mình viết đc như thế này:

int sodao(int n){
if(n/10==0)
return n;
else
int m=1000;
return sodao(n/10)+((n%10)*10);
}

code trên chỉ đúng với số 2 chữ số vì chỗ return cuối mình chỉ lấy (n%10)*10... nếu số 3 chữ số thì chỗ đó phải lấy (n%10)*100 và 4 chữ số thì (n%10)*1000,v.v... nhưng làm hoài ko ra...T__T... làm sao để khi đệ qui thì 3 chữ số thì (n%10)*100, 2 chữ số thì (n%10)*10,v.v... ví dụ như:

đệ qui: sodao(123) thì bằng sodao(123/10)+(123%10)*100




sodao(12)=sodao(12/10)+(12%10)*10

mọi người giúp mình với nha:D

lttq
17-10-2011, 10:18 AM
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "nhap so can dao : \n";
cin >> n;
if( n > 0 )
{
while(n!= 0)
{
cout << (char)( '0' + (n % 10) );
n /= 10;
}
cout << endl;
}
else
{
cout << "So ngay khong the viet nguoc lai duoc" << endl;
}
system("PAUSE");
return 0;
}

yo_yo12
17-10-2011, 11:49 AM
còn hàm đệ quy thì sao bạn??? giúp mình với nha :D

nth0504
09-09-2012, 06:58 PM
void daoso(int n)
{
if(n!=0)
{
printf("%d",n%10);
daoso(n/10);
}
}


bài đệ quy đảo ngược n này :D

VoTichSu
10-09-2012, 09:28 AM
void daoso(int n)
{
if(n!=0)
{
printf("%d",n%10);
daoso(n/10);
}
}

bài đệ quy đảo ngược n này :D

Moi bài cũ cả năm trời lên trả lời mà cũng sai. Yêu cầu bảo đảo ngược số chứ đâu có bảo in ra ngược!!!



// hàm đệ quy đảo ngược một số nguyên dương

int DaoSo(int so)
{
static int kqTam = 0; // biến để chứa kết quả tạm

if (so < 10)
{
so += kqTam * 10; // giữ trị lại, vì kqTam sẽ được hoàn nguyên
kqTam = 0; // hoàn nguyên trị ban đầu để hàm có thể tính số khác
return so;
}
kqTam = kqTam * 10 + so % 10;
return DaoSo(so / 10);
}


tb. Vấn đề của nguyên chủ, không cho sử dụng biến tạm thì tôi chịu thua. Bạn nào có cao kiến thì cứ thử cho mọi người cùng học hỏi.

luc13aka47
10-09-2012, 02:16 PM
Theo em, có thể "chơi bẩn" ở đây, vì tham số nhập bằng giá trị cũng có thể sử dụng như 1 biến cục bộ, nên ta có thể "chơi bẩn" kiểu :



int Func(int n, int nAgaint, int nAgaintAgaint); // cout<<Func(n,n,n); Sử dụng nAgaint và nAgaintAgaint như biến cục bộ.

Em nghĩ vấn đề ở đây là làm sao để phát hiện ra công thức để tính toán từ 1 số và kết quả là 1 số có các chữ số đã được đảo. ( Em đang nghĩ ... )

doicanhden
11-09-2012, 12:57 PM
^
Dùng đệ quy anh ạ. Như vậy sẽ giải quyết được tất cả vấn đề



int backsee(int number,int result=0)
{
if (number==0) return result;
return backsee(number/10,result*10+number%10);
}

ví dụ

trong main bạn gọi printf("So dao nguoc cua 12345 la : %d ",backsee(12345));

motminh
07-10-2012, 11:07 PM
#include<stdio.h>
#include<conio.h>

main()
{
int x;
printf("Nhap 1 so co 3 chu so: ");
scanf("%d",&x);
x=(x%10)*100+((x/10)%10)*10+x/100;
printf("So dao nguoc: %d",x);
getch();
}
đảo ngược được 3 số ,tham khảo nge:(|

anhthi1998
19-06-2018, 12:56 PM
#include <stdio.h>
int SoDaoNguoc(int n)
{
if(n/10==0)
return n;
else
{
printf("%d",n%10);
return SoDaoNguoc(n/10);
}
}
int main(int argc, char *argv[])
{
int n;
printf("Nhap n: ");
scanf("%d",&n);
printf("%d\n",SoDaoNguoc(n));
}

Monre
21-06-2018, 06:19 PM
#include <stdio.h>
int SoDaoNguoc(int n)
{
if(n/10==0)
return n;
else
{
printf("%d",n%10);
return SoDaoNguoc(n/10);
}
}
int main(int argc, char *argv[])
{
int n;
printf("Nhap n: ");
scanf("%d",&n);
printf("%d\n",SoDaoNguoc(n));
}


dùng đệ quy thì khó chấp nhận là tối ưu